根据从T-SQL中的结果获取的值,在XML结构中命名节点

时间:2016-10-28 18:22:35

标签: sql-server xml tsql

所以我知道你是否有这个:

DECLARE @XML XML = 
'<A>
    <First>1</First>
    <Second>2</Second>
    <Third>3</Third>
</A>'

--I can get the name of the node but...
SELECT
    Y.value('local-name(.)', 'varchar(50)') AS NodeName
FROM @XML.nodes('A/*') AS X(Y)

正如我之前在这样的线程中看到的好例子: How to get node name and values from an xml variable in t-sql

但是你可以走另一条路并使用结果集中的值来命名节点吗?我觉得我之前有过这样的事情,但是记不住这么想我会问。我对For XML和其他SQL Server XML创建的排列很生疏。

继续上面的例子:

SELECT
    Y.value('local-name(.)', 'varchar(50)') AS "ELEMENT-NODE" --Can I go from table to naming a node?
FROM @XML.nodes('A/*') AS X(Y)
--FOR XML AUTO, ELEMENTS  -- NOPE
FOR XML PATH(''), ROOT('A')

是否有一些语法说:&#34;嘿,将值设为节点的名称&#34;?

1 个答案:

答案 0 :(得分:2)

一般来说! - 无法从代码中设置列的别名。

解决方法有两种方法:

  • PIVOT,如果您事先知道所有现有名称
  • 动态SQL

在真正的通用需求方面,两者都有严重的限制。

就像一个例子,上面的XML可以这样解决:

DECLARE @XML XML = 
'<A>
    <First>1</First>
    <Second>2</Second>
    <Third>3</Third>
</A>
';

DECLARE @colList NVARCHAR(MAX)=
(
SELECT STUFF(
(
    SELECT ',''' + nd.value('.','nvarchar(max)') + ''' AS ' + QUOTENAME(nd.value('local-name(.)','nvarchar(max)'))
    FROM @XML.nodes('/A/*') AS A(nd)
    FOR XML PATH('')
),1,1,'')
);


EXEC(N'SELECT ' + @colList);

但是没有 one-for-everything 答案......