一尘不染

如何在SQL Server中创建参数化的XPath查询?

sql

我正在尝试在SQL Server中编写参数化查询,该查询使用参数值作为XPath的一部分,但是它似乎无法按我期望的方式工作。这是我的示例:

create table ##example (xmltest xml)

declare @LanguagePath varchar(75)

set @LanguagePath = '(/languages/language[@id="en-US"])[1]'
insert into ##example 
values ('<languages>
            <language id="en-US">c</language>
            <language id="es-ES">c</language>
        </languages>')

insert into ##example 
values ('<languages>
            <language id="en-US">b</language>
            <language id="es-ES">b</language>
        </languages>')


insert into ##example 
values ('<languages>
            <language id="en-US">a</language>
            <language id="es-ES">a</language>
        </languages>')

--This is a working statement:
--select *  from ##example 
--order by xmltest.value('(/languages/language[@id="en-US"])[1]', 'varchar')


declare @SQL nvarchar(4000)
set @SQL = '
select *  from ##example 
order by xmltest.value(@LanguagePath1, ''varchar'')
'

exec sp_executesql @SQL, N'@LanguagePath1 varchar(75)',  @LanguagePath1 = @LanguagePath;

drop table ##example

此代码导致错误:xml数据类型方法“值”的参数1必须为字符串文字。

关于如何使它起作用的任何想法?我想尝试使我的xpath查询免受SQL注入的影响。


阅读 185

收藏
2021-05-30

共1个答案

一尘不染

您应该使用sql:variable("@LanguagePath1")而不是@LanguagePath1在这里阅读更多有关它的信息。虽然我不确定动态xpath是否可以工作:)但是类似的东西xmltest.value('(/languages/language[@id=sql:variable("@languageCode")])[1]应该可以工作。

2021-05-30