使用条件替换查询 SQL 服务器中的 XML 数据

Query XML data in SQL Server using replace in criteria

我的 SQL Server 2008 table 中有一个 XML 列。我想要做的是针对我的存储过程的给定参数删除参数中的任何空格(使用 REPLACE)并在 WHERE 条件中使用它,然后还使用 XQuery exist 子句在 xml 数据上使用 REPLACE 方法:

-- Add the parameters for the stored procedure here
@PostCode varchar(20) = ''
AS
BEGIN
  -- strip out any spaces from the post code param
  SET @PostCode = REPLACE(@PostCode, ' ','')

  SELECT TOP 1 *
  FROM sd_LocalAuthorities
  WHERE PostCodes.exist(N'REPLACE(/PostCodes/PostCode/text(), '' '','''')[. = sql:variable("@PostCode")]') = 1   
END

我在 XQuery 中遇到错误 sd_LocalAuthorities.PostCodes.exist()

There is no function '{http://www.w3.org/2004/07/xpath-functions}:REPLACE()

当运行程序。 REPLACE() 是否有任何替代方法我可以用来去除这个 WHERE 标准的空格,我不想修改 table 本身。

有一个 XQuery 函数 'replace' 但它在您要使用它的 TSQL 中不可用。作为一种替代方法,您可以将邮政编码从 XML 中提取出来,然后对本机值进行替换。像这样;

declare @sd_LocalAuthorities table (id int, postcodes xml)
declare @PostCode varchar(20); set @PostCode = 'BB11BB'

insert @sd_LocalAuthorities values (1, N'<PostCodes><PostCode>AA1 1AA</PostCode></PostCodes>')
insert @sd_LocalAuthorities values (2, N'<PostCodes><PostCode>BB1 1BB</PostCode></PostCodes>')
insert @sd_LocalAuthorities values (3, N'<PostCodes><PostCode>CC1 1CC</PostCode></PostCodes>')

select top 1
    la.*
from 
    @sd_LocalAuthorities la
        cross apply la.postcodes.nodes('/PostCodes/PostCode') as t(c)
where 
    replace(t.c.value('.', 'varchar(20)'), ' ', '') = @PostCode

这种方法比将整个 XML document/fragment 转换为 varchar 更精确,因为它只对邮政编码值执行替换。根据您的情况,XML 索引可能有助于提高性能。