如何使用存储过程中的参数来检查特定的xml元素是否具有特定值?

时间:2016-11-25 14:16:28

标签: sql-server xml

我想在SQL Server中创建这个存储过程:

create procedure Test
    @pathToElement nvarchar(50),
    @value nvarchar(50)
as
    select top 10 * 
    from MyTable
    where SerializedXml.exist('@pathToElement[text() = @value]') = 1;

SerializedXmlxml中的MyTable列。

我收到以下错误:

  

不支持顶级属性节点

1 个答案:

答案 0 :(得分:0)

一种简单的方法是使其成为动态查询,例如:

CREATE TABLE #t(id INT IDENTITY(1,1),SerializedXml XML);
INSERT INTO #t(SerializedXml)VALUES
    ('<FormResults> <ID>00008</ID> <LocationID>42</LocationID> <LastSaveDate>2016-09-10T21:21:36</LastSaveDate> <Data> <txtSerGen>YY</txtSerGen> <txtGen>0602</txtGen> <txtYear>2016</txtYear> </Data> </FormResults>'),
    ('<FormResults> <ID>00008</ID> <LocationID>42</LocationID> <LastSaveDate>2016-09-10T21:21:36</LastSaveDate> <Data> <txtGen>0602</txtGen> <txtYear>2016</txtYear> </Data> </FormResults>');

DECLARE @pathToElement NVARCHAR(4000)='FormResults/Data/txtSerGen';
DECLARE @value NVARCHAR(4000)='YY';

DECLARE @dsql NVARCHAR(MAX) ='
select top 10 * 
from #t
where 
SerializedXml.exist('''+@pathToElement+'[(text()[1]) = "'+REPLACE(@value,'''','''''')+'"]'') = 1;';

EXEC sp_executesql @dsql;

DROP TABLE #t;

这将仅选择第一行。