Frage

Ich bin auf dem SQL Server 2005 und ich eine Störung erhalte, die ich ziemlich sicher bin, sollte nicht immer werden.

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.

Ich folge dem Beispiel # B auf diese MSDN-Link.

Mein gespeicherten proc-Code ist wie folgt. Ich kann es im Interesse dieses Beitrags vereinfachen, wenn Sie verlangen so:

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

Ich habe überprüft gibt es keine Datentyp fehlende Übereinstimmung zwischen dem Suchresultates von der Unterabfrage und dem strSearchTypeCode der Unterabfrage Ergebnis verglichen mit.

Ich sehe keinen Grund, warum dies nicht funktionieren sollte. Wenn Sie irgendwelche Hinweise haben, dann lassen Sie es mich wissen.

War es hilfreich?

Lösung

Versuchen Sie, die Abfrage neu anordnen, so dass der Booleschen Ausdruck in der subselect auftritt, z.

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

Andere Tipps

Ich weiß nicht, dass Sie die CASE-Anweisung innerhalb einer IN-Klausel so verwenden können. Ich würde vorschlagen, dass etwas zu umschreiben:

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

oder, wenn Sie wirklich, wie der Stil, den Sie bekam es:

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

In der Regel SQL sollte klug genug sein, um zu einem intelligenten, den Tisch zu optimieren weg, wenn @bitQuickSearch = 1. Aber ich den Abfrageplan prüfen würde, nur um sicher zu sein (Vertrauen ist gut, Kontrolle).

Es scheint mir, dass diese SELECT:

SELECT strSearchTypeCode FROM tblAdvanceSearchTypes

gibt mehrere Zeilen, und das ist Ihr Problem. Sie können es neu schreiben zu sein:

SELECT TOP 1 strSearchTypeCode FROM tblAdvanceSearchTypes
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top