存储在 table 中的 xml 值的名称列别名
Name column alias from xml value stored in table
我正在尝试根据另一个 table 中的 xml 值命名别名。该值由用户定义,因此不能静态命名。
XML 来自 table (table1) 和列 (TimeBuckets):
<buckets>
<bucket id="1" name="Overnight to 3 Mths">
<lower>0</lower>
<upper>3</upper>
</bucket>
</buckets>
我想根据 table1.'name' 中的 'name' 在 select 语句中设置列的别名。
我可以使用 xml 路径 select 名称值,如下所示:
table1.TimeBucket.value( '(buckets/bucket/@name)[1]', 'nvarchar(255)' )
我目前有以下 SQL 查询,但它不允许我以这种方式定义别名:
select 'test' as (table1.TimeBucket.value( '(buckets/bucket/@name)[1]', 'nvarchar(255)' )
from table1
两种方法:
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
因为对于 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;
我正在尝试根据另一个 table 中的 xml 值命名别名。该值由用户定义,因此不能静态命名。
XML 来自 table (table1) 和列 (TimeBuckets):
<buckets>
<bucket id="1" name="Overnight to 3 Mths">
<lower>0</lower>
<upper>3</upper>
</bucket>
</buckets>
我想根据 table1.'name' 中的 'name' 在 select 语句中设置列的别名。
我可以使用 xml 路径 select 名称值,如下所示:
table1.TimeBucket.value( '(buckets/bucket/@name)[1]', 'nvarchar(255)' )
我目前有以下 SQL 查询,但它不允许我以这种方式定义别名:
select 'test' as (table1.TimeBucket.value( '(buckets/bucket/@name)[1]', 'nvarchar(255)' )
from table1
两种方法:
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
因为对于 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;