0

我确定这是非常基本的,但是如何使用表名的变量设置 INSERT 语句?

例如,我有许多输入文件,所有配置都相同(输入 1、输入 2、输入 3,...)都将进入 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 语句,但我认为过程是相同的。

4

3 回答 3

4

如何使用表名的变量设置 INSERT 语句?

你没有,不是直接用SQL。表名和列名不能是变量。

您可以通过使用动态 SQL来实现这一点,但您必须小心不要引入SQL 注入

The Curse and Blessings of Dynamic SQL是一篇精彩的深入讨论动态 SQL 的文章。

于 2013-02-09T20:52:51.120 回答
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);
于 2013-02-10T01:49:50.983 回答
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 公式来创建查询。

于 2013-02-09T20:58:45.133 回答