2

SQL Serverでストアドプロシージャを使い始めたばかりで、かなり順調に進んでいますが、理解できない問題が発生しました。答えを探しましたが、正直なところ、正しい質問をしているのかわかりません。

私のspは:

ALTER PROCEDURE [FindName]
    @Square nvarchar(100) = null,
    @Location nvarchar(100) = null,
    @Name nvarchar(100) = null,
    @NormalizedName nvarchar(100) = null,
    @SharedLand int = 0,
    @FieldNumber int = 0,
    @Description nvarchar(255) = null,
    @Dwelling nvarchar(100) = null
AS

BEGIN
    SELECT * FROM [Holdings]
    WHERE 
        ([Square] LIKE @Square OR @Square IS NULL)
        AND ([Location] = @Location OR @Location IS NULL)
        AND ([Name] LIKE @Name OR @Name IS NULL)
        AND ([NormalizedName] LIKE @NormalizedName OR @NormalizedName IS NULL)
        AND ([SharedLand] = @SharedLand OR @SharedLand = 0)
        AND ([FieldNumber] = @FieldNumber OR @FieldNumber = 0)
        AND ([Description] LIKE @Description OR @Description IS NULL)
        AND ([Dwelling] LIKE @Dwelling OR @Dwelling IS NULL)
        ORDER BY
            CASE WHEN (@NormalizedName IS NOT NULL) THEN [NormalizedName]
            ELSE [No]
        END
END

これはすべて、CASEを使用せずに、CASEステートメントを使用して、一部またはすべてのパラメーターを使用するすべてのEXECで正常に機能し、次のように機能します。

EXEC FindName @Square = '%D%'
EXEC FindName @SharedLand = 1

しかし、私が試してみると:

EXEC dbo.cafgFindName @NormalizedName = '%Thomas%'

エラーが発生します: nvarchar値'Thomas'をデータ型intに変換するときに変換に失敗しました。

私が理解できないのは、実際にそれが問題であるとしても、変換がどこで行われているのかということです。

任意の提案をいただければ幸いです。

4

1 に答える 1

5

これは、CASE ステートメントが単一の型に解決される必要があるためです。この場合(しゃれは意図していません:) nvarchar OR intを検討しています([いいえ]はintであると思います)。

詳細については、こちらをご覧ください: Order by and Different Types in a CASE

于 2013-03-09T01:13:29.963 に答える