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に変換するときに変換に失敗しました。
私が理解できないのは、実際にそれが問題であるとしても、変換がどこで行われているのかということです。
任意の提案をいただければ幸いです。