【问题标题】:Name column alias from xml value stored in table来自存储在表中的 xml 值的名称列别名
【发布时间】:2018-01-06 20:46:51
【问题描述】:

我正在尝试根据另一个表中的 xml 值命名别名。该值由用户定义,因此不能静态命名。

来自表 (table1) 和列 (TimeBuckets) 的 XML:

<buckets>
  <bucket id="1" name="Overnight to 3 Mths">
    <lower>0</lower>
    <upper>3</upper>
  </bucket>
</buckets>

我想根据 table1 中的“名称”在 select 语句中设置列的别名。

我可以使用下面的xml路径选择名称值:

table1.TimeBucket.value( '(buckets/bucket/@name)[1]', 'nvarchar(255)' )

我目前有以下 SQL 查询,但它不允许我以这种方式定义别名:

select 'test' as (table1.TimeBucket.value( '(buckets/bucket/@name)[1]', 'nvarchar(255)' )
from table1

【问题讨论】:

    标签: sql sql-server xml alias


    【解决方案1】:

    因为列名是在 SQL 语句的编译时而不是在运行时解析的,所以只有动态 sql 可以这样做:

    declare @columnName as varchar(255);
    SELECT @columnName = TimeBucket.value( '(buckets/bucket/@name)[1]', 'nvarchar(255)' )
        FROM table1
        WHERE ID = 1; -- if you have more than one record in table1
    
    declare @sql nvarchar(max);
    set @sql = 'select ''test'' as [' + replace(@columnName, '''', '''''') + '] from table1;'
    
    exec sp_executesql @sql;
    

    【讨论】:

    • 谢谢你,我原以为会是这样。我理解上面的部分,但很难掌握@sql 变量在做什么?如果我想在返回值中添加一个选择,这会去哪里?
    • @sql 是你动态sql查询的存储
    • 好吧,这很有道理。如果我想从该表中返回一个特定值而不是字符串'test',我将如何去做呢?至于修改哪一部分?
    • @Sean_myers,只需将 'test' 替换为存储该特定值的列名
    • - 如果替换为列名 (testColumn) 例如:set @sql = 'select ''testCoulmn'' as [' + replace(@columnName, '''', '''' '') + '] 来自 table1;'。它将显示字符串 testColumn。要显示实际列,是否需要删除单引号?
    【解决方案2】:

    两种方法:

    declare @table1 table (TimeBucket xml)
    insert into @table1
    values('<buckets>
      <bucket id="1" name="Overnight to 3 Mths">
        <lower>0</lower>
        <upper>3</upper>
      </bucket>
    </buckets>')
    
    select test = t.TimeBucket.value( '(buckets/bucket/@name)[1]', 'nvarchar(255)' ),
                  t.TimeBucket.value( '(buckets/bucket/@name)[1]', 'nvarchar(255)' ) as test
    from @table1 t
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      相关资源
      最近更新 更多