为新的非 XML 行查询 XML 行

Que*_*CPO 4 xml sql-server

注意:请参阅 SQL Fiddle 上详细说明的示例,或查看以下代码:,因为这些DECLARE @XML variable示例在尝试从 XML 列实际获取 XML 数据并用于非 XML 行时混淆了语法:

CREATE TABLE ##xml (
    ID TINYINT IDENTITY(1,1),
    Value XML
)

INSERT INTO ##xml  (Value)
VALUES ('<Animals key="zoo" fish="22" dogs="0" birds="4" />')
    , ('<Animals key="house" fish="0" dogs="1" birds="2" />')
    , ('<Animals key="business" fish="0" dogs="0" birds="12" />')

SELECT *
FROM ##xml

SELECT nodes.child.value('key[1]', 'VARCHAR(50)')
FROM ##xml.Value.nodes('Animal') AS nodes(child)
-- Errors here, though the syntax looks correct

DROP TABLE ##xml
Run Code Online (Sandbox Code Playgroud)

我收到错误,“无效的列名 '##xml'。XMLDT 方法 'nodes' 只能在 xml 类型的列上调用”,即使我试图查询 XML 的节点以产生类似的结果下面:

Key      | Fish | Dogs | Birds
Zoo         22     0       4
House        0     1       2
Business     0     0      12
Run Code Online (Sandbox Code Playgroud)

请注意,如果我将 FROM 语句的语法更改为指向特定列 (Value),我会收到有关 Value 不是可识别的内置函数名称的其他错误。

Kev*_*cki 5

像这样做:

SELECT  nodes.child.value('@key','varchar(100)')
FROM    ##XML a
        CROSS APPLY a.value.nodes('/Animals') AS nodes(child)
Run Code Online (Sandbox Code Playgroud)