2008-10-10 3 views
1

올바른 방법은 무엇입니까? 예를 들어, 내가 어떻게이 서명에 저장 프로 시저를 바꿀 것 :저장 프로 시저에서 tristate 매개 변수 사용

CREATE PROCEDURE dbo.MyProcedure 
    @Param BIT = NULL 
AS 
    SELECT * 
    FROM dbo.SomeTable T 
    WHERE T.SomeColumn = @Param 

그래서 1 개 또는 0 수행 필터의 값으로 @Param을 제공하지만 지정되지 않았거나 통과 NULL 더 필터링을 수행 없다고? 고맙습니다.

답변

5

는 NULL이 나는이 일의 가장 깨끗한 방법 (T-SQL에서)이라고 생각하는 일이

CREATE PROCEDURE dbo.MyProcedure 
    @Param BIT = NULL 
AS 
    SELECT * 
    FROM dbo.SomeTable T 
    WHERE T.SomeColumn = @Param OR @Param IS NULL 
0

을 사용하여 "상관 없어"의미 가정입니다 :

SELECT * FROM TABLE WHERE column = ISNULL(@param, column) 

다른 RDBMS는 ISNULL 대신 COALESCE를 선호합니다.

다른 OR 절을 추가하기 시작하면 특히 여기에 의도가 무엇인지 명확히 알 수 있으며 AND 절과 결합 할 때 괄호가 필요하지 않게됩니다.

제한적으로 테스트 한 결과, ISNULL 대 OR @p IS NULL을 사용하여 무시할 수있는 퍼포먼스 증가가있었습니다. 아니야, ISNULL 을 사용하여 옹호하고자하는 것은 아니지만의 perf가 증가하기 때문에 (이는 극히 한계가 있으며 최악의 경우에 매우 특정한 경우에 영향을 받음) 중요한 비용이 들지 않는다는 점을 알아두면 좋습니다. 솔직히, 나는 왜 그것이 차이를 만들지 모르지만, 실행 계획은 필터 비용의 약 1 % 차이를 보여줍니다.

1

두 가지 이상의 방법이 있습니다. 여기에 하나 :

SELECT * 
    FROM dbo.SomeTable T 
    WHERE T.SomeColumn = COALESCE(@Param, T.SomeColumn) 

하지만 T.SomeColumn이 NULL 인 행은 포함되지 않습니다.

다음 대안은 해당 행이 포함됩니다 :

SELECT * 
    FROM dbo.SomeTable T 
    WHERE T.SomeColumn = @Param OR @Param IS NULL 

을하지만 사용하여, 당신은 예를 들어, 매개 변수를 전달하는 다른 방법을 사용하는 경우에 좋은하지 않습니다 반복 매개 변수의 단점이있다 자리 표시 자.

관련 문제