Я пытаюсь написать параметризованный запрос на SQL-сервере, который использует значение параметра как часть 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
Этот код приводит к ошибке:
Аргумент 1 метода типа данных xml «value» должен быть строковым литералом.
Есть идеи, как мне заставить это работать? Я хотел бы попытаться обезопасить свой запрос xpath от внедрения SQL.