我从previous question获得了以下查询,这在SQL中的动态表中执行。我怎么能把它传递到一张桌子里?我的意思是像sp_executesql @query中的select *。
我试过openrowset,但我的安全特权不允许。还有其他任何帮助吗?
谢谢,
Declare @cols as NVARCHAR(MAX), @query as NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(FIELD_NAME)
from bear_crossjoin
group by Field_Name, FIELDNUMBER
order by FIELDNUMBER
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = N'SELECT ' + @cols + N'
from
(
select substring, Field_Name,
rn = row_number() over(partition by field_name order by fieldnumber)
from bear_crossjoin
) x
pivot
(
max(substring)
for Field_Name in (' + @cols + N')
) p '
exec sp_executesql @query
Print(@query)将显示列名
SELECT [GRADE-BASIS-INDICATOR],[MOST-CURRENT-CODE],[PAY-PERIOD-NUMBER],[DATE-PROC-PP-BEGINS-CN],[DATE-PROC-PP-BEGINS-YR ],[行动代码],[NO-PERSONS-CASH-AWARD] ......其中有1085个
答案 0 :(得分:1)
由于提取动态字段列表,这种情况需要以SELECT {fields} INTO ##tmp FROM...
完成,因为没有简单的方法来获取CREATE TABLE
语句,特别是如果bear_crossjoin
表一样没有列出的数据类型。因此,请将Dynamic SQL更新为一行,如下所示:
set @query = N'SELECT ' + @cols + N'
INTO ##TempResults -- add this one line!!
from
(
...
exec sp_executesql @query
SELECT * FROM ##TempResults;
全局临时表(即##name
而不是#name
)将在子流程中生成。一张真正的桌子也能存活下来。但是,一旦子进程(即动态SQL)结束,本地临时表(即#name
而不是##name
)将消失。