Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.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 server TSQL XML定位特定块_Sql Server_Xml_Tsql_Xquery - Fatal编程技术网

Sql server TSQL XML定位特定块

Sql server TSQL XML定位特定块,sql-server,xml,tsql,xquery,Sql Server,Xml,Tsql,Xquery,您可以尝试以下方法: DECLARE @strAttributeID VARCHAR(1000) = '422' DECLARE @strAttributeValue VARCHAR(1000) = '190gsm' SELECT [AttributeValueXML] FROM [dbo].[tbl_Stock_Master_AttributeValue] WHERE [AttributeValueXML].exist('(/ArrayOfAttributeValueDO/Attribu

您可以尝试以下方法:

DECLARE @strAttributeID VARCHAR(1000) = '422'
DECLARE @strAttributeValue VARCHAR(1000) = '190gsm'

SELECT [AttributeValueXML] 
FROM [dbo].[tbl_Stock_Master_AttributeValue] 
WHERE [AttributeValueXML].exist('(/ArrayOfAttributeValueDO/AttributeValueDO[AttributeID=sql:variable("@strAttributeID") && AttributeValue=sql:variable("@strAttributeValue")])') = 1

这基本上为您提供了这两个标准适用的任何XML片段(整个
XML元素)。

一个机会是将整个批次作为派生表读取,并将过滤器与
放置在末尾(如另一个答案中所建议的那样)。但是——至少在我看来——将过滤器直接放在
XQuery
中更有效

如果您可以确定只有一种情况,请尝试以下方法:

DECLARE @AttributeID INT = 422
DECLARE @AttrValue VARCHAR(20) = 'gsm'

SELECT
    xc.query('.')
FROM
    @XMLData.nodes('/ArrayOfAttributeValueDO/AttributeValueDO') AS XT(XC)
WHERE
    xc.value('(AttributeID)[1]', 'int') = @AttributeID 
    AND xc.value('(AttributeValue)[1]', 'varchar(50)') LIKE '%' + @AttrValue + '%'
如果可能发生更多情况,请使用
.nodes()
获取拟合节点的派生表,并使用
.value()
从每个子节点获取所需的值:

DECLARE @strAttributeID VARCHAR(1000) = '422'
DECLARE @strAttributeValue VARCHAR(1000) = '190gsm'
SELECT @XMLData.value(N'(/ArrayOfAttributeValueDO
                         /AttributeValueDO[(AttributeID/text())[1]=sql:variable("@strAttributeID") 
                                            and contains((AttributeValue/text())[1],sql:variable("@strAttributeValue"))]
                         /AttributeValue/text())[1]','nvarchar(max)');

提示:使用
(SomeElement/text())[1]
SomeElement[1]/text()[1]
比简单的
SomeElement[1]
稍快一些。在您的情况下,它将返回相同的(具有更好的可读性)。。。但是:总的来说,我建议尽量具体一些

它不是
而不是
&
?此外,请在您的问题中包含您收到的完整错误消息(为了可读性,请将其区块引用)。
DECLARE @strAttributeID VARCHAR(1000) = '422'
DECLARE @strAttributeValue VARCHAR(1000) = '190gsm'
SELECT @XMLData.value(N'(/ArrayOfAttributeValueDO
                         /AttributeValueDO[(AttributeID/text())[1]=sql:variable("@strAttributeID") 
                                            and contains((AttributeValue/text())[1],sql:variable("@strAttributeValue"))]
                         /AttributeValue/text())[1]','nvarchar(max)');
SELECT Attr.value('(AttributeValue/text())[1]','nvarchar(max)')
FROM @XMLData.nodes(N'/ArrayOfAttributeValueDO
                      /AttributeValueDO[(AttributeID/text())[1]=sql:variable("@strAttributeID") 
                                            and contains((AttributeValue/text())[1],sql:variable("@strAttributeValue"))]') AS Searched(Attr);