SQL Server:如果在Select中的函数的表中找不到记录,请插入记录

SQL Server:如果在Select中的函数的表中找不到记录,请插入记录,sql,stored-procedures,user-defined-functions,sql-server-2014,openrowset,Sql,Stored Procedures,User Defined Functions,Sql Server 2014,Openrowset,我正在使用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\;',

我正在使用
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
中找到,则返回
CHARGETYID

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

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


您能为我的问题提供任何解决方案吗。

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

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

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

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

转储到一个临时表,然后进行比较转储到一个临时表,然后进行比较