Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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 - Fatal编程技术网

Sql 从xml数据列中选择属性作为行

Sql 从xml数据列中选择属性作为行,sql,sql-server,xml,Sql,Sql Server,Xml,我有一个xml专栏,里面有简单的xml,比如 <Data att1="test1" att123="test123" /> 尝试使用节点和查询函数,但它可以使用元素,但不能使用属性。。。这可以在不将属性转换为元素的情况下完成吗 编辑:我可以获取属性值,但如何也获取每行的属性名称 EDIT2:解决了这个问题,这个函数有一个本地名称 SELECT T.id, T2.Att.value('local-name(.)', 'varchar(50)'), T2.Att.value('.',

我有一个xml专栏,里面有简单的xml,比如

<Data att1="test1" att123="test123" />
尝试使用节点和查询函数,但它可以使用元素,但不能使用属性。。。这可以在不将属性转换为元素的情况下完成吗

编辑:我可以获取属性值,但如何也获取每行的属性名称

EDIT2:解决了这个问题,这个函数有一个本地名称

SELECT T.id, T2.Att.value('local-name(.)', 'varchar(50)'), T2.Att.value('.', 'nvarchar(max)')
FROM  T
CROSS APPLY DataXml.nodes('/Data/@*') as T2(Att) 
where T.id = 354

事情很简单:

  SELECT T.id, T2.Att.value('local-name(.)', 'varchar(50)'), T2.Att.value('.', 'nvarchar(max)')
    FROM  T
    CROSS APPLY DataXml.nodes('/Data/@*') as T2(Att) 
    where T.id = 354
你可以这样写:

DECLARE @xml as xml
DECLARE @path as varchar(max)
DECLARE @index int, @count int

SET @xml = 
'<Data att1="test1" att123="test123" />'



SELECT @index = 1

SET @count = @xml.query('count(/Data/@*)').value('.','int')

WHILE @index <= @count 
BEGIN
    SELECT  @xml.value('local-name((/Data/@*[sql:variable("@index")])[1])',
            'varchar(max)')
    SET @index = @index + 1
END
将@xml声明为xml
将@path声明为varchar(最大值)
声明@index int,@count int
SET@xml=
''
选择@index=1
SET@count=@xml.query('count(/Data/@*)).value('.','int'))
而@index
DECLARE @xml as xml
DECLARE @path as varchar(max)
DECLARE @index int, @count int

SET @xml = 
'<Data att1="test1" att123="test123" />'



SELECT @index = 1

SET @count = @xml.query('count(/Data/@*)').value('.','int')

WHILE @index <= @count 
BEGIN
    SELECT  @xml.value('local-name((/Data/@*[sql:variable("@index")])[1])',
            'varchar(max)')
    SET @index = @index + 1
END