2014-11-13 2 views
0

제품 유형 (prod_type)을 매개 변수로 최대 네 번 전달하는 저장 프로 시저가 있습니다. 잠재적으로 각 매개 변수는 널 (NULL) 일 수 있으며,이 경우 무시해야합니다. 요청 된 모든 제품 유형을 수집하기 위해 각 제품 유형 사이에 OR 연산자가 있어야합니다.TSQL 선택 사항 동일한 필드에서 작동하는 매개 변수

가능하면 sp_ExecuteSQL을 통과 한 동적 SQL 사용을 피하고 싶습니다.

내가 뭘하려고 오전의 단순화, 고립 버전 논의 다음과 같습니다 : 나는 실행 싶은 것이

CREATE TABLE #Products (Prod_ID int, prod_type int); 

INSERT INTO #Products 
SELECT 1, 2 
UNION ALL 
SELECT 2, 3 
UNION ALL 
SELECT 3, 3 
UNION ALL 
SELECT 4, 1 
UNION ALL 
SELECT 4, 5 

DECLARE @prod_type1 as int; 
DECLARE @prod_type2 as int; 
DECLARE @prod_type3 as int; 
DECLARE @prod_type4 as int; 

SET @prod_type1 = NULL; 
SET @prod_type2 = 2; 
SET @prod_type3 = NULL; 
SET @prod_type4 = 3; 

Select * from #Products 
WHERE ((prod_type = ISNULL(@prod_type1,prod_type)) 
OR (prod_type = ISNULL(@prod_type2,prod_type)) 
OR (prod_type = ISNULL(@prod_type3,prod_type) 
OR (prod_type = ISNULL(@prod_type4,prod_type)))) 

는 같은 : 위 분명히

Select * from [Product].[Product] 
WHERE (prod_type = 2 OR prod_type = 3) 

ISNULL 메서드는 각 행의 제품 유형을 자체적으로 비교하여 긍정적 인 '히트'를 발생 시키므로 ISNULL을 사용하는 해결 방법이 작동하지 않습니다. COALESCE도 같은 문제가 발생합니다.

누구나 sp_ExecuteSQL을 사용하지 않는 솔루션을 제안 할 수 있습니까?

답변

0

Where Clause을 다음과 같이 변경해보십시오.

Select * 
from 
#Products 
WHERE prod_type in(@prod_type1,@prod_type2,@prod_type2,@prod_type4) 
1

이 시도 :

DECLARE @ProdTypes TABLE (Prod_Type INT NOT NULL); 

INSERT INTO @ProdTypes (Prod_Type) VALUES (2); 
INSERT INTO @ProdTypes (Prod_Type) VALUES (3); 

SELECT pr.* 
FROM #Products pr 
WHERE EXISTS (SELECT 1 
       FROM @ProdTypes pt 
       WHERE pt.Prod_Type = pr.Prod_Type); 

EXISTS를 사용하여 논리적으로 OR 조건이 무엇인지 수 있습니다. 그것을하지 않는 @ProdTypes의 모든 행을 실행하지 않도록 일치가 발견되면 그리고 EXISTS이 종료됩니다 :

  • 일치는
  • 일치하는 값이 설정의 마지막 인 가치 없다가 있습니다 -)

그러나 여러 번 테이블 변수 전체를 검색하기 전에 종료됩니다.

편집 : 또한
, 당신은 프로 시저에 여러 @Prod_TypeX 매개 변수를 전달해서는 안된다. 대신 CSV 목록을 전달하고 SQLCLR 또는 XML 기반 문자열 분리자를 사용하여 테이블 변수에 삽입하십시오.

INSERT INTO @ProdTypes (Prod_Type) 
    SELECT CONVERT(INT, csv.SplitVal) 
    FROM dbo.SQLCLRorXMLbasedSplitter(@ProdTypesCSV) csv; 
+1

같은 생각이었습니다. 최선의 접근 방식 +1. – Rahul

관련 문제