2008-10-02 15 views
0

SQL Server 2005에 있는데 오류가 발생하는 것으로 알고 있습니다.오류를 일으키는 IN() 절의 하위 쿼리

Msg 512, Level 16, State 1, Procedure spGetSavedSearchesByAdminUser, Line 8 Subquery 
returned more than 1 value. This is not permitted when the subquery 
follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 

나는 this MSDN 링크를 예제 #의 B를 다음입니다.

내 저장된 proc 코드는 다음과 같습니다. 당신이 그렇게 요청하는 경우이 게시물의 위해를 단순화 할 수 있습니다 :

ALTER PROCEDURE [dbo].[spGetSavedSearchesByAdminUser] 
    @strUserName varchar(50) 
    ,@bitQuickSearch bit = 0 
AS 

BEGIN 

    SELECT [intSearchID] ,strSearchTypeCode ,[strSearchName] 
    FROM [tblAdminSearches] 

    WHERE 
     strUserName = @strUserName 
     AND 
     strSearchTypeCode 
      IN (
       CASE @bitQuickSearch 
       WHEN 1 THEN 'Quick' 
       ELSE (SELECT strSearchTypeCode FROM tblAdvanceSearchTypes) 
       END 
      ) 

    ORDER BY strSearchName 
END 

내가 서브 쿼리의 결과 집합 및 하위 쿼리 결과와 비교하는 strSearchTypeCode 사이에 데이터 형식이 일치하지 않습니다 확인했다.

이것이 작동하지 않아야하는 이유가 없습니다. 어떤 단서가 있다면 알려주세요.

답변

4

부울 표현식이 subselect 내부에서 발생하도록 쿼리를 다시 배열하십시오 (예 :

ALTER PROCEDURE [dbo].[spGetSavedSearchesByAdminUser] 
    @strUserName varchar(50) 
    ,@bitQuickSearch bit = 0 
AS 

BEGIN 

    SELECT [intSearchID] ,strSearchTypeCode ,[strSearchName] 
    FROM [tblAdminSearches] 

    WHERE 
     strUserName = @strUserName 
     AND 
     strSearchTypeCode 
       IN (SELECT strSearchTypeCode FROM tblAdvanceSearchTypes where @bitQuickSearch=0 
        UNION 
        SELECT 'Quick' AS strSearchTypeCode WHERE @bitQuickSearch=1) 

    ORDER BY strSearchName 
END 
+0

당신이 속는 사람이 있더라도 IN 절에서는 중요하지 않습니다. –

2

그런 IN 절에서 CASE 문을 사용할 수 있는지 모르겠습니다. 당신이 정말로 스타일처럼 당신이 거기에 도착하면,

WHERE strUserName = @strUserName AND (
    (@bitQuickSearch = 1 AND strSearchTypeCode = 'Quick') 
    OR 
    (strSearchTypeCode IN (SELECT strSearchTypeCode FROM tblAdvanceSearchTypes)) 
) 

또는 : 나는 비트를 다시 작성 좋을 것 일반적으로

WHERE strUserName = @strUserName 
    AND strSearchTypeCode IN (
     SELECT CASE @bitQuickSearch WHEN 1 THEN 'Quick' ELSE strSearchTypeCode END 
     FROM tblAdvanceSearchTypes 
    ) 

, SQL 테이블을 최적화 할 정도로 스마트 스마트해야 @bitQuickSearch = 1 인 경우. 그러나 쿼리 계획을 확인하면됩니다 (트러스트, 확인).

SELECT strSearchTypeCode FROM tblAdvanceSearchTypes 

여러 행을 반환하고 그 문제입니다 :

2

이 SELECT가 나에게 보인다. 다음과 같이 다시 쓸 수 있습니다.

SELECT TOP 1 strSearchTypeCode FROM tblAdvanceSearchTypes