SQL XML contains() with fn:lowercase()



我正在尝试使用contains((语句中的小写text((值进行Xpath查询。例如,搜索";纽约";与";纽约";将返回不同的结果。

从现在起,我计划确保存储过程中的参数是小写的,但我需要确保XML中的text((也是小写的。我尝试了几种不同的方法,但总是出现语法错误。注意:我正在<Company>节点中搜索New York,以确保没有得到任何与<City>节点匹配的记录。我刚开始使用常规的全文contains((,但后来为了准确起见,我使用了XPath。

DECLARE @Company nvarchar(100) = "new york"
SELECT ...
FROM OrderObject o
WHERE o.Address.exist('//Company/text()[contains(.,sql:variable("@Company"))]') = 1)
XML is like this... shorted for brevity
<Address>
<Company>1</Company>
<City>2</City>
<State>3</State>
</Address>

感谢

这里有一个正确的方法。

您需要将lower-case()函数应用于contains()函数的两个参数。

这种方式存储的过程参数可以在任何情况下:上限、下限、混合等。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML);
INSERT INTO @tbl (xmldata) VALUES
(N'<Address>
<Company>1</Company>
<City>NeW YoRk</City>
<State>NY</State>
</Address>'),
(N'<Address>
<Company>2</Company>
<City>Miami</City>
<State>FL</State>
</Address>');
-- DDL and sample data population, end
DECLARE @City NVARCHAR(100) = 'new york';
SELECT * 
FROM @tbl
WHERE xmldata.exist('/Address/City[contains(lower-case((./text())[1]),lower-case(sql:variable("@City")))]') = 1;

最新更新