簡體   English   中英

如何獲取SQL查詢結果列名稱作為第一行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM