簡體   English   中英

SQL Server:將“類型”添加到表中的每一列

[英]SQL Server : add 'Type' to every column in table

我在SQL Server中有一張表DemoTable 它具有以下列:

Column1, Column2, Column3

我想查詢表格

select * from DemoTable

但在查詢結果我想連接Type_所有可用的列名DemoTable

因此,此查詢的結果應顯示列

Type_Column1, Type_Column2, Type_Column3

有什么功能或任何方法可以實現這一目標嗎?

注意:只有N個列,而不僅僅是3個,僅用於手動重命名。

如果問題是您所說的:

連接所有表后,有很多重復的列名

那么典型的解決方案是不使用* 所以代替這個:

SELECT *
FROM A
JOIN B ON ...
JOIN C ON ...

...您應該考慮使用自定義列集,這是正常且推薦的方法,如以下示例所示:

SELECT A.Column1, A.Column2, B.Column3, C.Column4, C.Column5
FROM A
JOIN B ON ...
JOIN C ON ...

這是一種使用動態SQL自動執行任務的方法:

use MY_DATABASE;
go
--here you specify all your parameters,  names should be self-explanatory
declare @sql varchar(1000) = 'select ',
        @tableName varchar(100) = 'DemoTable',
        @prefix varchar(10) = 'Type_';

select @sql = @sql + name + ' as ' + @prefix + name + ',' from sys.columns
where object_name(object_id) = @tableName;

set @sql = left(@sql, len(@sql) - 1) + ' from ' + @tableName;

exec(@sql);

一些一般性的評論:

  • 在任何情況下,動態命名結果集的列都需要使用動態SQL。 沒辦法...
  • 在大多數情況下,命名列以攜帶額外的信息是一個非常糟糕的主意。
  • 我知道在SELECT * FROM ...處理星號並且仍然能夠完全控制列名和類型的唯一方法是XML。

嘗試這個:

SELECT TOP 10 * 
FROM sys.objects 
FOR XML RAW, ROOT('TableDef'),ELEMENTS, XMLSCHEMA,TYPE

這將返回sys.objects的前10行。 結果是XML,其中的行遵循XML模式定義。

動態創建完全內聯查詢是可能的(但請確保不是最佳性能)。 結果將是一個EAV列表,其中包含您需要的一切。

WITH PrepareForXml(QueryAsXml) AS
(
SELECT
    (
    SELECT TOP 10 * 
    FROM sys.objects 
    FOR XML RAW, ROOT('TableDef'),ELEMENTS, XMLSCHEMA,TYPE
    )
)
,AllRows AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) RowIndex
          ,rw.query('.') theRowXml
    FROM PrepareForXml
    CROSS APPLY QueryAsXml.nodes('TableDef/*:row') A(rw)
)
SELECT RowIndex
      ,B.ColumnName
      ,B.ColumnValue

      ,COALESCE(
      (SELECT QueryAsXml.value('declare namespace xsd="http://www.w3.org/2001/XMLSchema";
                                 (TableDef
                                 /xsd:schema
                                 /xsd:element
                                 /xsd:complexType
                                 /xsd:sequence
                                 /xsd:element[@name=sql:column("ColumnName")]
                                 /@type )[1]','nvarchar(max)') 
        FROM PrepareForXml)
      ,(SELECT QueryAsXml.value('declare namespace xsd="http://www.w3.org/2001/XMLSchema";
                                 (TableDef
                                 /xsd:schema
                                 /xsd:element
                                 /xsd:complexType
                                 /xsd:sequence
                                 /xsd:element[@name=sql:column("ColumnName")]
                                 /xsd:simpleType
                                 /xsd:restriction
                                 /@base)[1]','nvarchar(max)') 
        FROM PrepareForXml)
        ) AS ColumnType
FROM AllRows
CROSS APPLY theRowXml.nodes('*:row/*') A(col)
CROSS APPLY (SELECT col.value('local-name(.)','nvarchar(max)') ColumnName
                   ,col.value('(./text())[1]','nvarchar(max)') ColumnValue ) B;

這是結果集的開始:

RowIndex    ColumnName  ColumnValue ColumnType
1           name        sysrscols   sqltypes:nvarchar
1           object_id   3           sqltypes:int
1           schema_id   4           sqltypes:int
[...many more...]

我實際上不知道您需要什么,但是按原樣導出XML可能就足夠了。 一切都在那里...

更新:我沒有仔細閱讀...

您想弄清楚一個事實,即結果集的列名必須唯一,才能繼續執行此操作...

上面的方法不能解決此問題。 抱歉。

我不會立即刪除它...可能會有一些提示可以讓您擺脫此...

您可以使用以下查詢將“類型”添加到表中的每一列:

SELECT Column1 AS Type_Column1, Column2 AS Type_Column2, Column3 AS Type_Column3
FROM DemoTable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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