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)
答案 0 :(得分:1)
代码是临时表#storage
。问题是该表不在“范围内”,因此您无法在exec()
语句之外访问它。临时表在范围中受限于创建它们的特定进程。临时表在exec()
运行时可用,但不在其外部。文档中有一些解释(here)。
在某些情况下,您可以使用语句的insert . . . exec()
形式解决此问题。如果表是永久性的,您将为它构造create table
语句,然后执行:
insert into storage(...)
exec(@query);
或者,您甚至可以在动态SQL中执行此操作,因为永久表会在会话中持续存在。
在这种情况下,临时表的问题是您不知道其结构。您需要在执行插入之前创建表。变量结构需要动态SQL,并且在创建表时遇到同样的问题。它是在“错误的”lvel中创建的。
您可以将表更改为全局临时表(以##开头的表)。这包含了不同流程的范围。
或者,您可以创建一个带有时髦名称的持久表(我会使用_storage
或_storage_YYYYMMDDHHMMSS
,后者在末尾有一个时间戳)。请记住在完成后删除表格。