2009-09-03 1 views
0

내 프로 시저가 2005 년 데이터베이스에서 정상적으로 작동했지만 PC가 사망하고 다시 설정할 때 2005 년이 아니라 2008 년이 설치되었습니다. 이제이 프로 시저가 결과를 반환하지 않습니다. 이전에이 논리를 사용했기 때문에 2 가지 버전의 차이점에 대한 질문을 던졌고 이후에 프로 시저를 변경하지 않고 작동 했으므로 SQL 2008을 사용하는 유일한 변경 사항이 있습니다왜 SQL2008은 내 저장 프로 시저에서 조건부 WHERE 절을 2005 년과 마찬가지로 해석하지 않습니까?

Visual Studio에서 프로 시저를 작성하고 AND 및 OR를 결합하여 표현할 수있는 각 변형을 구성 할 수 있도록 테이블의 SQL 창에 SELECT 문을 붙여 넣을 때이를 재구성하고 확장 한 것을 알았습니다.

내가 필요로하는 것은 선택적으로 두 매개 변수 중 하나를 전달하는이 프로 시저를 호출 할 수 있다는 것입니다. 따라서 componentType 만 전달하면 명령문의 마지막 명령문 부분을 평가하고 전달 된 값을 사용해야합니다. 값이 전달되지 않으면 조건의 IS NULL 측과 일치합니다.

ALTER PROCEDURE dbo.uspSel_ComponentByType(
    @filterText  VARCHAR(50) = NULL 
, @componentType CHAR(2)  = NULL) 
AS 
SELECT [pkComponentID], [ComponentType], [ComponentName], [fkSupplierID], [Cost], [WastageCost] 
FROM [tblComponents] AS c INNER JOIN 
     [tblSuppliers] AS s ON [c].[fkSupplierID] = [s].[pkSupplierID] 
WHERE ([ComponentName] LIKE @filterText + '%' OR [SupplierName] LIKE @filterText + '%') 
AND [c].[IsDeleted] = 0 
AND (@componentType IS NULL OR [ComponentType] = @componentType) 
+0

로 ANSI_NULLS 함께,이다,이 옵션을 설정하려면 인해 같아요? –

+0

코드는 내가 작성한대로 Visual Studio (및 SSMS)가 구조를 바꿔서 다르게 배치합니다. –

답변

1

나는 어떤 SQL 프로는 아니지만, 내가 바로 당신의 의도를 이해한다면, 당신은 당신이 ''@filterText 기본 대신 NULL 경우 없음/중/두 매개 변수와 함께 SPROC를 사용하고 예상 결과를 얻을 수있을 것입니다 . SQL 서버 2005 및 2008 다르게 NULL 값을 문자열 연결을 처리하기 때문에

ALTER PROCEDURE dbo.uspSel_ComponentByType(
    @filterText   VARCHAR(50)  = ''  , 
    @componentType  CHAR(2)   = NULL 
) 
AS 
    SELECT ... --the rest of the sproc is unchanged 

데이비드 M 명확히으로

, 이것은 아마도입니다. SQL 서버 2005

'A string' + NULL = 'A string'; 

''에 기본값을 변경하여 SQL 서버 2008

'A string' + NULL = NULL; 

에있는 동안, 우리는 항상 % 모든 것을 일치로 취급 할 기본 비교 '' + '%'을 만든 것 같다 NULL + '%' 대신 upp NULL을 끝내고 아무 것도 일치하지 않습니다.

+0

초 단위로 치워 ...;) –

+1

SQL Server 2005에서 'A 문자열'+ NULL = NULL입니다. SET CONCAT_NULL_YIELDS_NULL : http://msdn.microsoft.com/en-us/library/ms176056(SQL.90)) .aspx – gbn

+0

... SQL Server 7 이후이 방법이 사용되었습니다. 연결에 대한 기본값이 있으며 새로운 데이터베이스가 버전간에 변경되었습니다. – gbn

1

null 값을 연결하는 다른 기본 처리처럼 보입니다. NULL에 '%'를 연결하면 NULL이되어 LIKE 비교가 실패합니다. NULL 기본값을 @filterText의 빈 문자열로 바꾸면 이러한 동작 차이에 영향을받지 않는 저장 프로 시저가 생깁니다.

+0

설명 해 주셔서 감사합니다 David; 그 용어로 그것에 대해 생각하는 것이 합리적이다. –

0

나는 비주얼 스튜디오에 의해 구조 조정으로 특히 가능성이 CONCAT_NULL_YIELDS_NULL은 당신이 그것을 쓴대로 절차를 게시 코드 또는 PROC가 버블

관련 문제