Как создать параметризованные запросы XPath на сервере SQL? - PullRequest
3 голосов
/ 16 июля 2009

Я пытаюсь написать параметризованный запрос на 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.

Ответы [ 2 ]

8 голосов
/ 16 июля 2009

Вы должны использовать sql:variable("@LanguagePath1") вместо @LanguagePath1. Подробнее об этом здесь . Хотя я не уверен, что динамический xpath будет работать :) Однако что-то вроде xmltest.value('(/languages/language[@id=sql:variable("@languageCode")])[1] должно работать.

0 голосов
/ 24 ноября 2010

Что делать, если условие целиком задано динамически.

@clause = xmltest.value('(/languages/language[@id="en-US"])[1]', 'varchar')=1

select *  from ##example 
where @clause
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...