这看起来相对简单,但显然并非如此。
我需要通过 select into 语法基于现有表创建临时表:
SELECT * INTO #TEMPTABLE FROM EXISTING_TABLE
问题是,现有的表名称是通过参数接受的...
我可以通过以下方式获取表的数据:
execute ('SELECT * FROM ' + @tableName)
但是我如何将两者结合起来,以便我可以将执行结果直接放入临时表中。
要使用的每个表的列都不相同,因此在获取数据之前构建临时表是不切实际的。
除了使用全局临时表之外,我愿意接受任何建议。
更新:
这完全是荒谬的,但我对全局临时表的保留是,这是一个多用户平台,如果该表长时间停留,就会出现问题......
Sooo..为了完成这一部分,我开始使用执行来生成全局临时表。
execute('select * into ##globalDynamicFormTable from ' + @tsFormTable)
然后我使用全局临时表来加载本地临时表:
select * into #tempTable from ##globalDynamicFormTable
然后我删除全局表。
drop table ##globalDynamicFormTable
这很脏,我不喜欢它,但目前,在我找到更好的解决方案之前,它必须起作用。
最后:
我想没有办法绕过它。
最佳答案似乎是:
在执行命令中创建一个 View ,并使用它来加载存储过程中的本地临时表。
在执行命令中创建一个全局临时表,并使用它来加载本地临时表。
话虽如此,我可能会坚持使用全局临时表,因为创建和删除 View 在我的组织中经过审核,而且我确信他们会质疑这种情况是否一直发生。
谢谢!
最佳答案
一个工作示例。
DECLARE @TableName AS VARCHAR(100)
SELECT @TableName = 'YourTableName'
EXECUTE ('SELECT * INTO #TEMP FROM ' + @TableName +'; SELECT * FROM #TEMP;')
具有可访问临时表的第二种解决方案
DECLARE @TableName AS VARCHAR(100)
SELECT @TableName = 'YOUR_TABLE_NAME'
EXECUTE ('CREATE VIEW vTemp AS
SELECT *
FROM ' + @TableName)
SELECT * INTO #TEMP FROM vTemp
--DROP THE VIEW HERE
DROP VIEW vTemp
/*START USING TEMP TABLE
************************/
--EX:
SELECT * FROM #TEMP
--DROP YOUR TEMP TABLE HERE
DROP TABLE #TEMP
关于sql - TSQL从动态sql中选择临时表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9534990/