0

私は SQL Server 2005 を使用していますが、エラーが発生するはずがないと確信しています。

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.

このMSDN リンクの例 # B に従っています 。

私のストアドプロシージャコードは次のとおりです。ご要望があれば、この投稿のために簡略化できます。

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

3 に答える 3

4

ブール式が副選択内で発生するようにクエリを再配置してみてください。

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
于 2008-10-02T16:43:41.547 に答える
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の場合、テーブルを最適化するのに十分なほどスマートである必要があります。ただし、クエリプランを確認するためにチェックします(信頼しますが、確認します)。

于 2008-10-02T16:42:28.833 に答える
2

このSELECT:

SELECT strSearchTypeCode FROM tblAdvanceSearchTypes

複数の行を返しますが、それが問題です。次のように書き直すことができます。

SELECT TOP 1 strSearchTypeCode FROM tblAdvanceSearchTypes
于 2008-10-02T16:42:35.403 に答える