我确定这是非常基本的,但是如何使用表名的变量设置INSERT语句?
例如,我有许多输入文件,所有输入文件都配置相同(Input1,Input2,Input3,...)都进入INSERT或MERGE语句。
我想做一个循环,处理所有输入文件,或者将INSERT语句作为函数调用
INSERT INTO [OutputFile]
SELECT i.*
FROM [<Input Variable>] i
LEFT JOIN [OutputFile] OP
ON CONCAT(i.Field1, i.Field6) = CONCAT(OP.Field1, OP.Field6)
WHERE OP.Field1 IS NULL
PRINT 'Number of rows added is ' + CAST(@@ROWCOUNT as char(6));
我实际上将使用MERGE语句,但我认为该过程将是相同的。
答案 0 :(得分:4)
如何使用表名的变量设置INSERT语句?
你没有,不是直接使用SQL。表名和列名不能是变量。
您可以使用dynamic SQL来实现此目的,但必须注意不要引入SQL Injection。
The Curse and Blessings of Dynamic SQL是一篇非常精彩的讨论动态SQL的文章。
答案 1 :(得分:1)
您可以使用动态SQL。 QUOTENAME()
函数将使用和转义方括号来帮助防止SQL注入。
declare @table sysname = 'MyTable';
declare @sql nvarchar(max) = '
INSERT INTO [OutputFile]
SELECT i.*
FROM {{table}} i
LEFT JOIN [OutputFile] OP
ON (CONCAT(i.Field1, i.Field6)
= CONCAT(OP.Field1, OP.Field6))
WHERE OP.Field1 IS NULL
';
set @sql = REPLACE(@sql, '{{table}}', QUOTENAME(@table));
exec(@sql);
答案 2 :(得分:0)
为什么要循环?只需使用union all
:
insert into OutputFile
select i.*
from ((select * from input1) union all
(select * from input2) union all
. . .
(select * from inputn)
) i left outer join
OutputFile op
on CONCAT(i.Field1, i.Field6) = CONCAT(OP.Field1, OP.Field6)
WHERE OP.Field1 IS NULL
如果有很多表,您可以将它们放在Excel的一列中,并使用Excel公式创建查询。