Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据表中存储的xml值命名列别名_Sql_Sql Server_Xml_Alias - Fatal编程技术网

Sql 根据表中存储的xml值命名列别名

Sql 根据表中存储的xml值命名列别名,sql,sql-server,xml,alias,Sql,Sql Server,Xml,Alias,我试图根据另一个表中的xml值命名别名。该值由用户定义,因此不能静态命名 来自表(表1)和列(计时器)的XML: 我当前有以下SQL查询,但它不允许我以这种方式定义别名: select 'test' as (table1.TimeBucket.value( '(buckets/bucket/@name)[1]', 'nvarchar(255)' ) from table1 有两种方法可以做到这一点: declare @table1 table (TimeBucket xml) insert i

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

来自表(表1)和列(计时器)的XML:

我当前有以下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
declare@table1表(TimeBucket xml)
插入@table1
价值('
0
3.
')
选择test=t.TimeBucket.value('(bucket/bucket/@name)[1],'nvarchar(255)'),
t、 TimeBucket.value('(bucket/bucket/@name)[1],'nvarchar(255')作为测试
来自@table1t

因为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变量在做什么?如果我想在返回值中添加一个select,它会去哪里?@sql是一个用于动态sql查询的存储,这很有意义。如果我想从该表而不是字符串“test”返回一个特定的值,我该怎么做呢?至于我要修改哪一部分?@Sean_myers,只需将“test”替换为存储该特定值的列名-如果替换为列名(testColumn),例如:设置@sql=”从表1中将“testCoulmn”选择为['+replace(@columnName,'','')+']。它将显示字符串testColumn。要显示实际列,是否需要重新添加单引号?
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
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;