SQL SERVER - COALESCE()函数的问题

时间:2011-06-15 16:34:34

标签: sql-server coalesce sql-function

我有一个由存储过程包装的SQL函数:

ALTER FUNCTION dbo.GetObjList
(
    @filterUID int = NULL,
    @filterSID varchar(32) = NULL
)
RETURNS TABLE
AS

RETURN 

SELECT ROW_NUMBER() OVER (ORDER BY UID) AS [RowNumber], * 
FROM ObjTable
WHERE 
    (COALESCE(@filterUID, @filterSID) IS NULL) OR 
    (
        ((@filterUID IS NOT NULL) AND (UID = @filterUID)) OR
        ((@filterSID IS NOT NULL) AND (SID = @filterSID))
    )

为什么我会收到这样的错误:“将varchar值'abc'转换为数据类型int时转换失败。”如果我只传递@filterSID = 'abc'作为参数(和DEFAULT for其他)?

我注意到COALESCE对错误负责。

编辑:现在我得到了错误的原因...并且事实上我实际上有很多参数...你们会推荐什么作为解决方案?

2 个答案:

答案 0 :(得分:8)

COALESCE

  

返回类型

     

返回最高数据类型优先级的表达式的数据类型。如果所有表达式都是不可为空的,则结果将被输入为nonnullable。

(强调补充)。 int的值为higher precedence而不是varchar,因此COALESCE的返回类型必须是int类型。显然,你的varchar值不能这么转换。

您可以简单地将where子句重写为:

WHERE 
    (@filterUID IS NULL AND @filterSID IS NULL) OR 
    (@filterUID IS NOT NULL AND UID = @filterUID) OR
    (@filterSID IS NOT NULL AND SID = @filterSID)

答案 1 :(得分:3)

尝试将Coalesce中的参数转换为Varchar
例如:

(COALESCE(CONVERT(VARCHAR,@filterUID), CONVERT(VARCHAR,@filterSID)) IS NULL) OR