SQL XML查询,在表中定义了xpath

时间:2014-09-12 09:26:06

标签: sql sql-server xml xpath

我正在尝试使用SQL Query从XML中提取一些数据,如果表中定义的XPath要查询xml值,我将获取值为null(对于查询3)。这是一个例子。 Mike Eriksson和TT建议我使用动态查询,但是为什么查询1正在使用动态sql。

 DECLARE @StudentData XML
SET @StudentData =N'<StudentData>
  <Properties>
    <Property>
      <Name>RollNumber</Name>
      <Value>2127</Value>
    </Property>
    <Property>
      <Name>SudentName</Name>
      <Value>ABCD</Value>
    </Property>
    <Property>
      <Name>Subject1</Name>
      <Value>80</Value>
    </Property>
    </Properties>
</StudentData>';
CREATE TABLE #PropertyPath (    
    XPath VARCHAR (2000)   NOT NULL,    
    Id INT NOT NULL       
);

INSERT INTO #PropertyPath
SELECT 'RollNumber',1
UNION 
SELECT 'SudentName',2
UNION 
SELECT 'Name',3

CREATE TABLE #Property (    
    StudentData XML NOT NULL,
    RefId INT NOT NULL       
);

INSERT INTO #Property
SELECT @StudentData,3

INSERT INTO #Property
SELECT @StudentData,1

--Query 1
SELECT A.StudentData.value('(/StudentData/Properties/Property/*[local-name()=sql:column("XPath")])[1]','VARCHAR(100)'),XPath FROM #Property A
INNER JOIN #PropertyPath B
ON A.RefId =B.Id

--Query 2
SELECT @StudentData.value('(/StudentData/Properties/Property[Name=''RollNumber'']/Value)[1]','VARCHAR(100)')

--Query 3
SELECT A.StudentData.value('(/StudentData/Properties/Property[Name=''[local-name()=sql:column("XPath")]'']/Value)[1]','VARCHAR(100)'),XPath FROM #Property A
INNER JOIN #PropertyPath B
ON A.RefId =B.Id

DROP TABLE #PropertyPath
DROP TABLE #Property   

我做错了什么或不可能?

1 个答案:

答案 0 :(得分:1)

  

为什么查询1如何处理动态sql。

对于等于列XPath中的值的节点名称,XQuery中的谓词为true。 sql:column()用于从列中提取值。 local-name()返回当前节点名称。 #PropertyPath中的第三行的值为Name,这意味着您为RollNumber上的匹配返回了值Name,并为NULL返回了RollNumber } XPath,因为XML中没有名为RollNumber的节点。

  

我将值作为空值(对于查询3)

在查询3中,您将节点Name的值与字符串[local-name()=sql:column("XPath")]进行比较,并且由于XML中没有值为[local-name()=sql:column("XPath")]的节点,因此NULL结果。

更新

要获取名称匹配的值,您可以使用:

SELECT A.StudentData.value('(/StudentData/Properties/Property[(Name/text())[1] = sql:column("XPath")]/Value/text())[1]','VARCHAR(100)'),
       XPath 
FROM #Property A
INNER JOIN #PropertyPath B
ON A.RefId =B.Id