从子查询中获取SQL查询的字段名称

时间:2013-11-12 14:34:21

标签: sql sql-server subquery eval

是否可以从子查询中为SELECT查询指定字段名称? 例如,我有一个以下查询返回一个数据透视表:

SELECT [Rank], [a], [b], [c], [d], [e], [f], [g], [h]
FROM
(SELECT [File], [Rank], [Piece]
FROM [TableName])
AS [SRC]
PIVOT
(MAX([Piece])
FOR [File]
IN ([a], [b], [c], [d], [e], [f], [g], [h]))
AS [PVT]
ORDER BY [Rank] DESC

所以基本上我需要动态生成这些“[a],[b],[c],[d],[e],[f],[g],[h]”(参数相关) ,作为另一个查询的结果,例如来自一些#TempTable。我想我需要使用某种Eval()函数(如果它当然存在)?我希望它看起来像这样:

SELECT [Rank], Eval("SELECT ... FROM ...")
FROM
(SELECT [File], [Rank], [Piece]
FROM [TableName])
AS [SRC]
PIVOT
(MAX([Piece])
FOR [File]
IN ( Eval("SELECT ... FROM ...") ))
AS [PVT]
ORDER BY [Rank] DESC

1 个答案:

答案 0 :(得分:0)

感谢Tobberoth,需要的代码如下:

DECLARE @filelist varchar(MAX) =
STUFF(
(SELECT DISTINCT ', [' + [File] + ']'
FROM [#TempTableName]
FOR XML PATH(''))
,1,1,'')

DECLARE @query varchar(MAX) = 
'SELECT [Rank], ' + @filelist + '
FROM
(SELECT [File], [Rank], [Piece]
FROM [TableName])
AS [SRC]
PIVOT
(MAX([Piece])
FOR [File]
IN (' + @filelist + '))
AS [PVT]
ORDER BY [Rank] DESC'

EXECUTE (@query)