按变量引用表

时间:2013-02-09 20:50:03

标签: sql sql-server tsql sql-server-2012-express

我确定这是非常基本的,但是如何使用表名的变量设置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语句,但我认为该过程将是相同的。

3 个答案:

答案 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公式创建查询。