在 t-sql 执行语句中填充 temp table

Populating temp table in t-sql execute statement

我正在尝试填充临时 table 以便稍后在存储过程中查询。因为我正在填充来自多个 table 的数据,所以我尝试使用 EXEC 语句在循环中执行此操作:

最初我从我的动态 sql 中得到一个错误,我必须声明 table 变量。我这样做了,但是我的动态 sql 之外的 sql 在我的临时 table 中看不到数据。这是我的 SQL 的样子:

--Original Query:

DECLARE @sql2 varchar(8000)

set @sql2 = 'INSERT INTO @temp_table SELECT  TOP 10 my_id, my_text FROM my_dynamic_table'
exec(@sql2)

select * from @temp_table  --Normal query

必须在 set @sql2 = 'INSERT... 行上声明 table 变量“@temp_table”

DECLARE @sql2 varchar(8000)

DECLARE @temp_table TABLE(my_id bigint NULL, my_text text NULL)

set @sql2 = 'DECLARE @temp_table TABLE(my_id bigint NULL, my_text text NULL);INSERT INTO @temp_table SELECT  TOP 10 my_id, my_text FROM my_dynamic_table;select * from @temp_table;'
exec(@sql2)

select * from @temp_table  --Normal query

我在 运行 exec(@sql2) 时看到数据,在正常查询中看不到它。

@temp_table 不是临时变量 table,而是 table 变量。这听起来可能很迂腐,但它们在 SQL 服务器中是不同的概念。

您运行遇到范围问题。在您的第一个查询中, exec 进程无法访问存储过程中的变量,这就是它在第二个查询中起作用的原因。但是,在您的第二个查询中,@temp_table 将只有 INSERT 的内容,即在同一调用中 运行。

您可以从 table 变量切换到实际温度 table 来解决这个问题。子进程可以访问其父进程 tables.

DROP TABLE IF EXISTS #temp_table;
CREATE TABLE #temp_table (my_id bigint NULL, my_text text NULL);

set @sql2 = 'INSERT INTO #temp_table SELECT  TOP 10 my_id, my_text FROM my_dynamic_table'
exec(@sql2)

select * from #temp_table