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