Pat*_*ick 19 sql t-sql sql-server temp-tables
这似乎相对简单,但显然不是.
我需要通过select into语法创建一个基于现有表的临时表:
SELECT * INTO #TEMPTABLE FROM EXISTING_TABLE
Run Code Online (Sandbox Code Playgroud)
问题是,通过参数接受现有的表名...
我可以通过以下方式获取表的数据:
execute ('SELECT * FROM ' + @tableName)
Run Code Online (Sandbox Code Playgroud)
但是如何将这两者结合起来以便我可以将执行结果直接放入临时表中.
将要用于的每个表的列都不相同,因此在获取数据之前构建临时表是不切实际的.
除了使用全局临时表之外,我对任何建议持开放态度.
更新:
这是完全荒谬的,但我对全球临时表的保留意见是,这是一个多用户平台,如果桌子会长时间停留,就会出现问题......
Sooo ..只是为了通过这个部分,我已经开始使用execute生成一个全局临时表.
execute('select * into ##globalDynamicFormTable from ' + @tsFormTable)
Run Code Online (Sandbox Code Playgroud)
然后我使用全局临时表来加载本地临时表:
select * into #tempTable from ##globalDynamicFormTable
Run Code Online (Sandbox Code Playgroud)
然后我删除全局表.
drop table ##globalDynamicFormTable
Run Code Online (Sandbox Code Playgroud)
这很脏,我不喜欢它,但暂时,直到我得到一个更好的解决方案,它必须工作.
到底:
我想没有办法解决它.
最好的答案似乎是;
在execute命令中创建一个视图,并使用它来加载存储过程中的本地临时表.
在execute命令中创建一个全局临时表,并使用它来加载本地临时表.
有了这个说我可能只是坚持使用全局临时表,因为在我的组织中审计创建和删除视图,我相信如果它一直开始发生,他们会质疑.
谢谢!
Kaf*_*Kaf 24
一个工作的例子.
DECLARE @TableName AS VARCHAR(100)
SELECT @TableName = 'YourTableName'
EXECUTE ('SELECT * INTO #TEMP FROM ' + @TableName +'; SELECT * FROM #TEMP;')
Run Code Online (Sandbox Code Playgroud)
具有可访问临时表的第二个解
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
Run Code Online (Sandbox Code Playgroud)