SQL XML contains() 和 fn:lowercase()

SQL XML contains() with fn:lowercase()

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

我打算确保从现在开始进入存储过程的参数是小写的,但我需要确保 XML 中的 text() 也是小写的。我尝试了几种不同的方法,但不断出现语法错误。注意:我正在搜索 New York 的 <Company> 节点,以确保我没有得到与 <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>

谢谢

这是正确的方法。

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

这种方式的存储过程参数绝对可以是任何大小写:upper、lower、mixed 等

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;