我正在尝试使用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
我做错了什么或不可能?
答案 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