2012-10-02 5 views
3

사용자가 자신의 필터를 만들 수있는 ASP.NET MVC 3 앱이 있습니다. amount > 5 and amount <= 7 등과 같은 것입니다. 사용자는 금액 값과 운영자를 모두 선택할 수 있습니다.저장 프로 시저에 연산자 전달

내 문제는 이러한 필터를 데이터를 검색하는 저장 프로 시저로 전달하는 방법입니다. 저장 프로 시저가 이미 꽤 복잡하여 null로 체크 된 많은 매개 변수가 전달된다는 것을 의미하므로 여기에서 찾은 대답을 실제로 적용 할 수 없습니다. T-SQL Stored Procedure - Dynamic AND/OR Operator

내가 할 수있는 다른 방법이 있습니까? ?

답변

4

연산자는 매개 변수화 될 수 없습니다. 이 저장 프로 시저입니다 언급 때문에, 유일한 옵션은 SP 내부의 T-SQL을 작성하고 sp_executesql을 사용하는 것입니다 즉

//TODO : verify (whitelist) that @operator is in a known set of values... 
// '=', '<>', '>', '<' etc - otherwise security risk 
declare @sql varchar(4000) = 'select * from Foo where Bar ' 
      + @operator + ' @value' 
exec sp_executesql @sql, N'@value int', @value 

이 즉시 쿼리 (@sql)를 구축하지만, 값을 유지 (@value) 전체적으로 매개 변수화되었으므로 연산자 (@operator)를 화이트리스트로 작성하면됩니다. 여기

//TODO : verify (whitelist) that @operator is in a known set of values... 
// '=', '<>', '>', '<' etc - otherwise security risk 
declare @sql varchar(4000) = 'select * from Foo where Bar ' 
      + @operator + ' @p' 
exec sp_executesql @sql, N'@p int', @value 

, @p내부 SQL에서 매개 변수의 이름이고, @value는 매개 변수의 이름입니다

그냥 값이 매개 변수가 남아 있는지 보여주기 위해, 우리는 또한 사용할 수도 저장 프로 시저; sp_executesql에 대한 세 번째/네 번째/다섯 번째/etc 매개 변수는 두 번째 (이 예에서는 단지 @p으로 선언 됨) 매개 변수로 선언 된 매개 변수에 매핑됩니다.

저장 프로 시저가 아닌 경우 C#에서 쿼리 작성 단계를 수행하여 값을 매개 변수로 다시 유지할 수 있습니다.

1

저는 동적 SQL을 사용하는 것이 유일한 방법이라고 생각합니다 (예 : sq_executesql). 이렇게하면 SQL 문을 문자열로 작성한 다음 실행할 수 있습니다. 하지만 아마도 기존 스토어드 프로 시저를 다시 작성해야 할 것입니다.

관련 문제