SQL Server:如果在选择中的函数的表中找不到,则插入记录

Posted

技术标签:

【中文标题】SQL Server:如果在选择中的函数的表中找不到,则插入记录【英文标题】:SQL Server: Insert record if not found in table from a function in Select 【发布时间】:2016-04-13 09:04:40 【问题描述】:

我正在使用 OPENROWSET.csv 文件导入 SQL Server 2014。

这是我的查询

SELECT 
    ufnGetChargeTypeId([Charge Type]) AS ChargeTypeId, [Description] 
FROM 
    OPENROWSET ('MSDASQL', 
                'Driver=Microsoft Access Text Driver (*.txt, *.csv); DBQ=D:\Files\;', 
                'SELECT * from [myfile.csv]' )

[Charge Type].csv 文件中的列标题。 ufnGetChargeTypeId 是一个函数,如果在引用表 ChargeType 中找到,则返回 ChargeTypeId

如果[Charge Type] 存在,则工作正常。如果找不到,我想在表中插入[Charge Type] 并返回ChargeTypeId。用户定义的函数不支持在表中插入/更新。

一种解决方案是使用存储过程,但我在Select 语句中调用函数,您不能在Select 语句中执行存储过程。

你能为我的问题提出任何解决方案吗?

【问题讨论】:

转储到一个临时表,然后进行比较 【参考方案1】:

您可以先插入所有缺失的类型,然后运行您的查询:

DECLARE @T TABLE([Charge Type] varchar(4000), [Description] text)

INSERT INTO @T
SELECT [Charge Type], [Description]
FROM 
    OPENROWSET ('MSDASQL', 
                'Driver=Microsoft Access Text Driver (*.txt, *.csv); DBQ=D:\Files\;', 
                'SELECT * from [myfile.csv]' )

INSERT INTO ChargeTypes ([Charge Type])
SELECT DISTINCT [Charge Type]
FROM @T
WHERE [Charge Type] NOT IN (SELECT [Charge Type] FROM ChargeTypes)

SELECT 
    ufnGetChargeTypeId([Charge Type]) AS ChargeTypeId, [Description] 
FROM @T

【讨论】:

以上是关于SQL Server:如果在选择中的函数的表中找不到,则插入记录的主要内容,如果未能解决你的问题,请参考以下文章

如果在 Hive SQL 中找不到匹配项,则提供要加入的备用列

更新 SQL Server 2005 中的表列

SQL Server - 从其他表中排除记录

SQL SERVER如何更新另一个表中存在的表中的所有行

如何修改sql server 2000 里的表中的内容?

如何从 SQL Server 中的表中删除重复行 [重复]