2017-12-07 8 views
4
DECLARE @XMLData XML 

SET @XMLData = '<ArrayOfAttributeValueDO> 
     <AttributeValueDO> 
     <AttributeID>421</AttributeID> 
     <AttributeValue>100% cotton pre-shrunk drill</AttributeValue> 
     </AttributeValueDO> 
     <AttributeValueDO> 
     <AttributeID>422</AttributeID> 
     <AttributeValue>190gsm</AttributeValue> 
     </AttributeValueDO> 
     <AttributeValueDO> 
     <AttributeID>1221</AttributeID> 
     <AttributeValue>Long Sleeve</AttributeValue> 
     </AttributeValueDO> 
     <AttributeValueDO> 
     <AttributeID>1481</AttributeID> 
     <AttributeValue>No</AttributeValue> 
     </AttributeValueDO> 
    </ArrayOfAttributeValueDO>' 

を見つけますか?TSQLのXMLは、特定のブロック(複数可)上記の例を考えると

私は種類のこのような構文を期待していますが、実際には「[]」 の間に誤差が生じています、私は422のattributeIDattributeValueで任意の<AttributeValueDO>を取得しようとしていますと、

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 
+1

'&&'ではなく' and'ですか?また、あなたの質問に表示されている完全なエラーメッセージを含めてください(読みやすくするために引用符を付けてください)。 –

答えて

0
「GSM」の単語が含まれています

あなたはこのような何かを試すことができます。

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 + '%' 

これは基本的に、あなたにそれらの2つの基準が適用されるすべてのXMLフラグメント(全<AttributeValueDO> XML要素)を与えます。

3

1つのチャンスは、抽出されたテーブルとしてロット全体を読み取り、最後にWHEREというフィルタを配置することです(他の回答に示唆されているように)。しかし、少なくとも私の目では、フィルタを直接XQueryに配置する方が効率的です。

一つだけのoccuranceがこれを試すがあることを、確認することができた場合:

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

occurancesが出て必要な値を取得するためにフィッティングノードと.value()の派生テーブルを取得するために.nodes()を使用して、よりがあるかもしれない場合

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

ヒント:各サブノード(SomeElement/text())[1]又はSomeElement[1]/text()[1]を使用した単純なSomeElement[1]よりわずかに速くあります。あなたの場合、それは同じ(より読みやすく)返されます...しかし、一般的に私はできるだけ具体的にすることをお勧めします。 Find more details on /text() here

関連する問題