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ステートメントを使用しますが、プロセスは同じであると思います。

4

3 に答える 3

4

how do I set up an INSERT statement using a variable for the table name?

You don't, not directly with SQL. Table names and column names cannot be variables.

You can achieve this by using dynamic SQL, but you have to be careful not to introduce SQL Injection.

The Curse and Blessings of Dynamic SQL is a fantastic in depth article discussing dynamic 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 に答える