我需要执行一些动态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参数将返回多个结果集时,这显然会失败。这有可能吗?
答案 0 :(得分:1)
使用临时表(不是表变量):
CREATE TABLE #Table1(...)
CREATE TABLE #Table2(...)
DECLARE @MyDynamicSql NVARCHAR(MAX) = N'
INSERT INTO #Table1(...)
SELECT ...
INSERT INTO #Table2(...)
SELECT ...'
EXEC(@MyDynamicSql)
但是,在编写这种意大利面条代码时要注意以下几点:
DROP
语句,如果您更改临时表的结构,SQL解析器也会向您抛出错误(阅读:运行批处理进行更改之前,必须先删除表)其结构)#
的连接)才能持久供父级访问({{3 }})