2016-05-24 4 views
3

以下のxmlは、tblUsersというテーブルの列(Name UserBody)の値として存在します。SQLテーブルの列からXPath値を読み取る

SQLのXpathを使用して、NewUserTypeの名前、つまり「SampleUserName」を読み取る必要があります。

<UserTypeAdded xmlns="http://schemas.datacontract.org/2004/07/ABC.Domain.Contract.EventModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
     <UserTypeTypeDetails xmlns:a="http://schemas.datacontract.org/2004/07/ABC.Common.Contract"> 
      <a:Id>550d9a76-3d7d-49f6-9243-f0473d32b123</a:Id> 
      <a:Name>Special User Types</a:Name> 
     </UserTypeTypeDetails> 
     <NewUserType xmlns:a="http://schemas.datacontract.org/2004/07/ABC.Domain.Contract.Base"> 
      <Id xmlns="http://schemas.datacontract.org/2004/07/ABC.Common.Contract">dfa090ff-9756-42fd-be9b-02ac8c6b123</Id> 
      <Name xmlns="http://schemas.datacontract.org/2004/07/ABC.Common.Contract">SampleUserName</Name> 
     </NewUserType> 
    </UserTypeAdded> 

私は声明

SELECT 
    [UserBody].value('(/UserTypeAdded/NewUserType/Name[1])', 'nvarchar(max)') as UserName 
    FROM tblUsers 

の下に使用してみましたが、運

答えて

0

あなたが持っている、誤ってノードを定義している:

'(/UserTypeAdded/NewUserType/Name[1])' 
あなたは、各要素の位置を指定する必要が

次のいずれか

'(/UserTypeAdded[1]/NewUserType[1]/Name[1])' 

または全体のパットを包みますparenethesisでの時間とそのための位置指定:

-- SAMPLE DATA 
DECLARE @tblUsers TABLE (UserBody XML); 
INSERT @Tblusers 
VALUES('<UserTypeAdded xmlns="http://schemas.datacontract.org/2004/07/ABC.Domain.Contract.EventModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
     <UserTypeTypeDetails xmlns:a="http://schemas.datacontract.org/2004/07/ABC.Common.Contract"> 
      <a:Id>550d9a76-3d7d-49f6-9243-f0473d32b123</a:Id> 
      <a:Name>Special User Types</a:Name> 
     </UserTypeTypeDetails> 
     <NewUserType xmlns:a="http://schemas.datacontract.org/2004/07/ABC.Domain.Contract.Base"> 
      <Id xmlns="http://schemas.datacontract.org/2004/07/ABC.Common.Contract">dfa090ff-9756-42fd-be9b-02ac8c6b123</Id> 
      <Name xmlns="http://schemas.datacontract.org/2004/07/ABC.Common.Contract">SampleUserName</Name> 
     </NewUserType> 
    </UserTypeAdded>'); 

-- QUERY 
WITH XMLNAMESPACES 
( 'http://schemas.datacontract.org/2004/07/ABC.Domain.Contract.Base' AS a, 
    'http://schemas.datacontract.org/2004/07/ABC.Common.Contract' AS x, 
    DEFAULT 'http://schemas.datacontract.org/2004/07/ABC.Domain.Contract.EventModel' 
) 
SELECT *, 
     UserBody.value('(/UserTypeAdded/NewUserType/x:Name)[1]', 'nvarchar(max)') as UserName 
FROM @TblUsers; 

ます。また、名前空間のためのワイルドカードを使用することができます:

SELECT *, 
     UserBody.value('(/*:UserTypeAdded/*:NewUserType/*:Name)[1]', 'nvarchar(max)') as UserName 
FROM @TblUsers; 
0

あなたのXMLは、あなたのXQueryで検討する必要が異なる名前空間の完全ではありません。あなたは、URIを名前空間、および例えば、名前空間内の要素を参照するために接頭辞を使用する接頭辞をマップするためにWITH XMLNAMESPACESを使用することができます。

WITH XMLNAMESPACES 
(
    'http://schemas.datacontract.org/2004/07/ABC.Domain.Contract.EventModel' as utaNs, 
    'http://schemas.datacontract.org/2004/07/ABC.Common.Contract' as nameNs 
) 
SELECT 
    [UserBody].value('(/utaNs:UserTypeAdded/utaNs:NewUserType/nameNs:Name)[1]', 'nvarchar(max)') as UserName 
FROM tblUsers 
0
SELECT @x.value('(/*:UserTypeAdded/*:NewUserType/*:Name)[1]', 'NVARCHAR(MAX)') 
0

あなたはまた、あなたのXML名前空間を定義する必要が

'(/UserTypeAdded/NewUserType/Name)[1]' 

をお試しください -

declare @XML xml = ' 
<UserTypeAdded xmlns="http://schemas.datacontract.org/2004/07/ABC.Domain.Contract.EventModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
     <UserTypeTypeDetails xmlns:a="http://schemas.datacontract.org/2004/07/ABC.Common.Contract"> 
      <a:Id>550d9a76-3d7d-49f6-9243-f0473d32b123</a:Id> 
      <a:Name>Special User Types</a:Name> 
     </UserTypeTypeDetails> 
     <NewUserType xmlns:a="http://schemas.datacontract.org/2004/07/ABC.Domain.Contract.Base"> 
      <Id xmlns="http://schemas.datacontract.org/2004/07/ABC.Common.Contract">dfa090ff-9756-42fd-be9b-02ac8c6b123</Id> 
      <Name xmlns="http://schemas.datacontract.org/2004/07/ABC.Common.Contract">SampleUserName</Name> 
     </NewUserType> 
    </UserTypeAdded>' 


select T.N.value('(/*:UserTypeAdded/*:NewUserType/*:Name)[1]', 'nvarchar(max)') as UserName 
from @XML.nodes('/*:UserTypeAdded') as T(N) 
0

以下のクエリを使用します。

 SELECT [UserBody].value('(/UserTypeAdded/NewUserType/Name)[1]', 'nvarchar(max)') as UserName 
    FROM tblUsers 
関連する問題