2009-07-16 3 views
3

XPath의 일부로 매개 변수 값을 사용하는 SQL 서버에 매개 변수화 된 쿼리를 작성하려고하지만 예상대로 작동하지 않습니다. 오류에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 

이 코드 결과 : 여기 내 샘플입니다 xml 데이터 형식 방법 "값"의 인수 (1)는 리터럴 문자열이어야합니다.

어떻게 작동시킬 수 있습니까? 내 xpath 쿼리를 SQL injection으로부터 안전하게하려고 노력하고 싶습니다.

답변

8

@LanguagePath1 대신 sql:variable("@LanguagePath1")을 사용해야합니다. 그것에 대해 자세히 알아보십시오 here. 비록 동적 xpath가 작동하는지 확신 할 수 없지만 :) xmltest.value('(/languages/language[@id=sql:variable("@languageCode")])[1]과 같은 것이 작동 할 것입니다.

+0

달콤한 감사합니다. 그게 정확히 내가 찾고 있던 것이 었습니다. –

+0

Saulius, 내 솔루션은 왜 작동합니까? http://goo.gl/pI4Ap – ekkis

0

전체 조건이 동적으로 주어지면 어떻게 될까요?

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

select * from ##example 
where @clause 
+1

where 절을 매개 변수로 전달할 수 있기 때문에 작동하지 않을 것이라고 생각합니다. 모든 것을 문자열로 바꾸고 @clause를 연결하면 작동 할 것입니다.하지만 전체 문자열에 입력하는 것과 다를 수없는 매개 변수화 된 쿼리가 아니므로 SQL 주입을 피할 때 매개 변수. Saulius는 잘 작동했습니다. –

관련 문제