2013-02-09 133 views
0

我敢肯定這是非常基本的,但我如何設置一個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

爲什麼要做循環?只需使用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的公式來創建查詢。

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);