将来自动态SQL的结果插入2个表变量

时间:2018-07-10 19:27:25

标签: sql-server

我需要执行一些动态SQL,该SQL将返回2个结果集并将结果集存储在表变量中。

假设我有2个表(糟糕的架构,但说明了我的问题)

表1:

 ItemID int
 ItemName nvarchar(50)

表2:

ItemId int
Quantity int

我生成一些如下所示的动态sql:

DECALRE @sql varchar(max);
SET @sql = 'SELECT * FROM Table1; SELECT * from Table2';

然后创建表变量:

DECALRE @tbl1 TABLE (ItemId int, ItemName nvarchar(50))
DECALRE @tbl2 TABLE (ItemId int, Quantity int)

然后,我要执行该动态SQL,并将结果插入刚刚声明的表变量中。如果动态sql中只有一个结果集,我可以简单地运行以下命令:

INSERT into @tbl1execute ('SELECT * FROM Table1;')

但是,当我使用@sql参数将返回多个结果集时,这显然会失败。这有可能吗?

1 个答案:

答案 0 :(得分:1)

使用临时表(不是表变量):

CREATE TABLE #Table1(...)
CREATE TABLE #Table2(...)
DECLARE @MyDynamicSql NVARCHAR(MAX) = N'
    INSERT INTO #Table1(...)
    SELECT ...
    INSERT INTO #Table2(...)
    SELECT ...'
EXEC(@MyDynamicSql)

但是,在编写这种意大利面条代码时要注意以下几点:

  1. 重新运行相同的代码(在存储过程之外)将需要删除(或至少截断)临时表
  2. 上述附录:即使您有DROP语句,如果您更改临时表的结构,SQL解析器也会向您抛出错误(阅读:运行批处理进行更改之前,必须先删除表)其结构)
  3. 如果您的进程是已用相同名称声明临时表的子程序...请确保避免这种情况,我花了数小时试图弄清楚这个进程,以为自己发疯了。
  4. 声明为内部动态SQL的
  5. 临时表需要进行连接或全局作用域(分别为2和3个#的连接)才能持久供父级访问({{3 }})