在 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
我正在尝试填充临时 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