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);