在SQL Server存储过程中出现CASE语句问题

Pet*_*r C 2 sql-server sql-server-2008 sql-server-2008-r2

我刚刚开始在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
Run Code Online (Sandbox Code Playgroud)

对于所有使用任何或所有参数而不使用CASE但使用CASE语句的所有EXEC都可以正常工作,以下工作:

EXEC FindName @Square = '%D%'
EXEC FindName @SharedLand = 1
Run Code Online (Sandbox Code Playgroud)

但是当我尝试:

EXEC dbo.cafgFindName @NormalizedName = '%Thomas%'
Run Code Online (Sandbox Code Playgroud)

我收到错误: 将nvarchar值'Thomas'转换为数据类型int时转换失败.

我无法理解的是转换发生在哪里,如果确实是问题.

任何建议赞赏.

Ste*_*rne 5

这是因为CASE语句必须解析为单一类型.在这种情况下(没有双关语:)你正在考虑一个nvarchar或一个int(我假设[No]是一个int).

有关详细信息,请参见此处: CASE中的排序和不同类型