Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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
在T-SQL中解析XML_Sql_Sql Server_Xml - Fatal编程技术网

在T-SQL中解析XML

在T-SQL中解析XML,sql,sql-server,xml,Sql,Sql Server,Xml,我知道已经有很多关于在MS T-SQL中查询xml的主题,但是对于所有的示例,我无法使我的查询正常工作 我有以下XML: <group> <items> <groupitem> <key>23137</key> </groupitem> <groupitem> <key>23139</key&

我知道已经有很多关于在MS T-SQL中查询xml的主题,但是对于所有的示例,我无法使我的查询正常工作

我有以下XML:

<group>
    <items>
        <groupitem>
            <key>23137</key>
        </groupitem>
        <groupitem>
            <key>23139</key>
        </groupitem>
        <groupitem>
            <key>23151</key>
        </groupitem>
        <groupitem>
            <key>23153</key>
        </groupitem>
    </items>
</group>
这给了我4个空行,如果我删除[1],它会给我以下错误:“XQuery[value()]:“*value()”需要一个单例(或空序列),找到的操作数类型为“xdt:untypedAtomic”

然后我试了一下:

SELECT doc.value('(/group/items/groupitem/key)[1]', 'nvarchar(255)') AS 'key'
    FROM @xml.nodes('/group/items/groupitem/*') AS ref(doc)
这实际上给了我一些数据,但不幸的是,它是同一个键23137的4倍,可能是由语句中的[1]引起的。但是,删除它会使我返回到与以前相同的错误消息


我知道我应该如何在Xpath(/group/items/groupitem/key)中实现它,但我不知道应该如何在t-Sql中实现它。有什么想法吗?

在下面的查询中,
doc
的上下文元素已经是
key
元素:

SELECT doc.value('(key/text())[1]', 'nvarchar(255)') AS 'key'
FROM @xml.nodes('/group/items/groupitem/*') AS ref(doc)
SELECT doc.value('.', 'nvarchar(255)') AS 'key'
FROM @xml.nodes('/group/items/groupitem/*') AS ref(doc)
因此,您不应在select子句中再次提及
键。您可以使用
来引用当前上下文元素:

SELECT doc.value('(key/text())[1]', 'nvarchar(255)') AS 'key'
FROM @xml.nodes('/group/items/groupitem/*') AS ref(doc)
SELECT doc.value('.', 'nvarchar(255)') AS 'key'
FROM @xml.nodes('/group/items/groupitem/*') AS ref(doc)
试试这个:

SELECT 
    doc.value('(key)[1]', 'int') AS 'key'
FROM 
    @xml.nodes('/group/items/groupitem') AS ref(doc)
在我的例子中,这将返回如下输出:

key
-----
23137
23139
23151
23153
这就是你要找的吗


.nodes()
的调用基本上为您提供了一个XML片段的“伪”表——每个匹配的XPath表达式对应一个。因此,在您的示例中,返回了四行XML,每行表示
节点的内容。你进入其中,抓住里面包含的
元素的值,将其转换为
int
——然后,完成了

您是否有任何理由在
.nodes()
中的XPath表达式末尾添加星号?你期待不同的元素吗?谢谢你的解释,这确实是我想要的。还有一个问题:为什么需要[1]?@ErikL:因为可能有多个元素嵌套在父元素下。仅使用
(key)
将返回一个元素集合,并且您无法将整个XML元素集合转换为原子值(如
int
)-只有一个元素谢谢,这确实有效。我猜nodes语句中的*是一个通配符,而且由于groupitem下面只有一个元素,所以它被分配到doc的根?这可能是text()在OP的查询中故意的,可能忽略了更深层次的节点内容。然后是“(./text())[1]”