代码之家  ›  专栏  ›  技术社区  ›  Shivpe_R

SQL Server:将“Type”添加到表中的每一列

  •  1
  • Shivpe_R  · 技术社区  · 6 年前

    DemoTable 在SQL Server中。它有以下列:

    Column1, Column2, Column3
    

    我想查询这个表

    select * from DemoTable
    

    Type_ 中所有可用的列名 可降级的 .

    所以这个查询的结果应该是显示列

    Type_Column1, Type_Column2, Type_Column3
    

    有什么功能或方法来实现这一点吗?

    注意:有N个列,不只是3个,只是手动重命名而已。

    4 回复  |  直到 6 年前
        1
  •  1
  •   Michał Turczyn    6 年前

    下面是使用动态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);
    
        2
  •  3
  •   Peter B    6 年前

    如果问题如你所说:

    典型的解决办法是 不使用 * . 所以不是这样:

    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 ...
    
        3
  •  1
  •   Community CDub    5 年前

    一些一般性意见:

    • 在任何情况下,动态命名结果集的列都需要动态SQL。没办法。。。
    • 命名列来携带额外的信息在大多数情况下是一个非常糟糕的主意。
    • 我所知道的唯一解决问题的方法 星号 在一个 SELECT * FROM ...

    试试这个:

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

    这将返回 sys.objects

    动态地创建完全内联查询是可能的(但肯定不是性能最好的)。结果将是 企业价值 列出你需要的一切。

    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可能就足够了 原样 . 里面什么都有。。。

    你想骗过一个事实,一个结果集的列名必须是唯一的才能继续这个。。。

    上述方法不能解决这个问题。对不起的。

    我不会马上删除这个。。。也许你能从中得到一些提示。。。

        4
  •  0
  •   Grant Miller    6 年前

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