【问题标题】:Referring to a table by variable通过变量引用表
【发布时间】:2013-02-09 20:50:03
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    你可以通过dynamic SQL来实现,但是你要注意不要引入SQL Injection

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

    【讨论】:

      【解决方案2】:

      您可以使用动态 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);
      

      【讨论】:

        【解决方案3】:

        为什么要循环?只需使用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 公式创建查询。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-04
          • 2012-03-28
          相关资源
          最近更新 更多