Sql server 将动态SQL的结果插入到2个表变量中

Sql server 将动态SQL的结果插入到2个表变量中,sql-server,Sql Server,我需要执行一些动态SQL,它将返回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'; 然后我创建我的表变量: DECA

我需要执行一些动态SQL,它将返回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)
CREATE TABLE #Table1(...)
CREATE TABLE #Table2(...)
DECLARE @MyDynamicSql NVARCHAR(MAX) = N'
    INSERT INTO #Table1(...)
    SELECT ...
    INSERT INTO #Table2(...)
    SELECT ...'
EXEC(@MyDynamicSql)
然后我想执行动态SQL,并将结果插入到我刚才声明的表变量中。如果动态sql中只有一个结果集,我只需运行以下命令:

INSERT into @tbl1execute ('SELECT * FROM Table1;')
然而,当我使用@sql参数返回多个结果集时,这显然失败了。这可能吗?

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

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

  • 重新运行相同的代码(在存储过程之外)将需要删除(或至少截断)临时表
  • 上面的附录:如果您更改临时表的结构,即使您有
    DROP
    语句,SQL解析器也会向您抛出错误(阅读:在运行批处理之前,您必须删除表以更改其结构)
  • 如果您的进程是一个已经以相同名称声明临时表的子例程。。。为了避免这种情况,我花了好几个小时试图弄明白这一点,我觉得自己快要发疯了
  • 动态SQL中声明的临时表需要连接或全局作用域(分别为2和3)才能持久化,以便父级访问()

  • 不,不能从一条动态语句插入到两个表中。请注意,这里不需要动态sql,至少在这个简化的示例中是这样。另外,您正在插入示例中未声明的
    @tbl1execute
    。请问我们的最终目标是什么?也许有更好、更简单的方法……:)你能解释一下你想通过这样做达到什么目的吗?也许有更好的方法来做你想做的事情……是的,这个例子是垃圾,但我试图说明这个问题。真正的例子是,我们有一个函数,它用ROW OVER包装一个查询,并获取分页信息,如总页数等,用于Execute,但是我需要在另一个表上进行分页,该表可能有当前页的记录,也可能没有记录。我的希望是把结果扔到一个变量中并加入,但看起来这是不可能的。是时候在查询上手动编写该行了,不要依赖该函数。嘿@Elaskanator,谢谢你的建议,但是,这对我的情况不起作用,如果你看看原始帖子上的评论,你就会明白为什么。不过我很感谢你抽出时间。