簡體   English   中英

如何在SQL Server中創建參數化的XPath查詢?

[英]How do I create parametrized XPath queries in SQL server?

我正在嘗試在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]可以工作。

如果要動態給出整個條件,該怎么辦。

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

select *  from ##example 
where @clause

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM