动态查询不写入临时表

时间:2014-01-14 23:01:39

标签: sql dynamic

DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);


select @cols = STUFF((SELECT distinct ',' +
                        QUOTENAME(hi)
                      FROM #hello 
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '');
--select @cols                         

上述代码由于某种原因未在#storage临时表中输入日期? 为什么会这样?

select @query = 'SELECT *
into #storage 
FROM (
SELECT *
FROM #hello) up
PIVOT ( MAX(AFEAmount) FOR hi IN (' + @cols + ') ) AS pvt'

exec(@query)

1 个答案:

答案 0 :(得分:1)

代码是临时表#storage。问题是该表不在“范围内”,因此您无法在exec()语句之外访问它。临时表在范围中受限于创建它们的特定进程。临时表在exec()运行时可用,但不在其外部。文档中有一些解释(here)。

在某些情况下,您可以使用语句的insert . . . exec()形式解决此问题。如果表是永久性的,您将为它构造create table语句,然后执行:

 insert into storage(...)
     exec(@query);

或者,您甚至可以在动态SQL中执行此操作,因为永久表会在会话中持续存在。

在这种情况下,临时表的问题是您不知道其结构。您需要在执行插入之前创建表。变量结构需要动态SQL,并且在创建表时遇到同样的问题。它是在“错误的”lvel中创建的。

可以将表更改为全局临时表(以##开头的表)。这包含了不同流程的范围。

或者,您可以创建一个带有时髦名称的持久表(我会使用_storage_storage_YYYYMMDDHHMMSS,后者在末尾有一个时间戳)。请记住在完成后删除表格。