[英]How to get SQL query result column name as first row
我有一個動態SQL查詢,執行后可以得到結果集。 但是,我正在從SQL Server引擎呈現結果的UI模型沒有提供呈現查詢列名稱的方法。
由於查詢的動態性質,我無法在設計時對列名進行硬編碼。 所以我的問題是如何獲取列名以及查詢返回的數據集?
該查詢:
DECLARE @SQLSTATMENT nvarchar(1000)
SELECT @SQLSTATEMENT = '
SELECT
convert(date, DATEADDED) DATEADDED
,COUNT(1) as NUMBEROFRECORDS
FROM
dbo.CONSTITUENT
GROUP BY
convert(date, DATEADDED)
ORDER BY
convert(date, DATEADDED) DESC
'
Exec (@SQLSTATEMENT);
給我這張桌子( 原始圖像 ):
+ ---------- + --------------- +
| DATEADDED | NUMBEROFRECORDS |
+ ---------- + --------------- +
| 2017-03-14 | 1 |
| 2017-03-10 | 1 |
| 2016-07-07 | 5 |
| 2016-06-29 | 3 |
| 2016-06-15 | 1 |
| 2014-11-11 | 465 |
| 2005-06-09 | 11 |
| 2005-04-13 | 1 |
| 2005-02-28 | 2 |
+ ---------- + --------------- +
但是我想要這個( 原始圖像 ):
+ ---------- + --------------- +
| DATEADDED | NUMBEROFRECORDS |
+ ---------- + --------------- +
| DATEADDED | NUMBEROFRECORDS |
| 2017-03-14 | 1 |
| 2017-03-10 | 1 |
| 2016-07-07 | 5 |
| 2016-06-29 | 3 |
| 2016-06-15 | 1 |
| 2014-11-11 | 465 |
| 2005-06-09 | 11 |
| 2005-04-13 | 1 |
| 2005-02-28 | 2 |
+ ---------- + --------------- +
謝謝
可行,但不是很漂亮。 通過動態SQL的存儲過程會更干凈
我們實質上是在動態SQL中進行動態SQL
一個警告:我保留了RN字段
示例(使用我的FRED系列數據)
-- This is Your Base/Initial Query, or the only portion you need to supply
Declare @SQL varchar(max) = 'Select Updated as Updated,Count(*) as NumberOfRecords From [dbo].[FRED-Series] Group By Updated'
Select @SQL = '
;with cte0 as ('+@SQL+')
, cte1 as (Select *,RN = Row_Number() over (Order By (Select null)) From cte0 )
, cte2 as (
Select A.RN,C.*
From cte1 A
Cross Apply (Select XMLData=cast((Select A.* for XML Raw) as xml)) B
Cross Apply (
Select Item = attr.value(''local-name(.)'',''varchar(100)'')
,Value = attr.value(''.'',''varchar(max)'')
,ColNr = Row_Number() over (Order By (Select Null))
From B.XMLData.nodes(''/row'') as A(r)
Cross Apply A.r.nodes(''./@*'') AS B(attr)
Where attr.value(''local-name(.)'',''varchar(100)'') not in (''RN'')
) C
)
Select Distinct RN=0,Item,Value=Item,ColNr Into #Temp From cte2 Union All Select * from cte2
Declare @SQL varchar(max) = Stuff((Select '','' + QuoteName(Item) From #Temp Where RN=0 Order by ColNr For XML Path('''')),1,1,'''')
Select @SQL = ''Select '' + @SQL + '' From (Select RN,Item,Value From #Temp ) A Pivot (max(Value) For [Item] in ('' + @SQL + '') ) p''
Exec(@SQL);
'
Exec(@SQL)
退貨
Updated NumberOfRecords
Updated NumberOfRecords
2017-03-22 597
2017-03-23 40
2017-03-20 228
2017-03-21 1404
只是一些評論
cte0是您的主要查詢
cte1將獲取您初始查詢的結果並添加行號
cte2將動態取消數據顯示
為了方便起見,將cte2的結果放入#temp表中(假設允許這樣做)
然后我們執行動態樞軸
將靜態查詢與列名合並。 您必須將第二個查詢的結果強制轉換為varchar或nvarchar,以便它們與列名具有相同的數據類型。
DECLARE @SQLSTATMENT nvarchar(1000)
SELECT @SQLSTATEMENT = '
SELECT
''DATEADDED'' AS [DATEADDED]
,''NUMBEROFRECORDS'' AS [NUMBEROFRECORDS]
SELECT
CAST(convert(date, DATEADDED) AS NVARCHAR(MAX)
,CAST(COUNT(1) AS NVARCHAR(MAX))
FROM
dbo.CONSTITUENT
GROUP BY
convert(date, DATEADDED)
ORDER BY
convert(date, DATEADDED) DESC
'
Exec (@SQLSTATEMENT);
這樣,您應該能夠通過代碼引用列名,而不必將其添加到查詢中。 這樣,您可以保留結果集的數據類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.