2

我有这个由存储过程包装的 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'如果我仅作为参数传递(其他参数为默认值)?

我注意到 COALESCE 对错误负责。

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

4

2 回答 2

8

COALESCE

返回类型

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

(强调补充)。int 的优先级高于 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)
于 2011-06-15T16:42:01.007 回答
3

尝试将参数转换CoalesceVarchar
例如:

(COALESCE(CONVERT(VARCHAR,@filterUID), CONVERT(VARCHAR,@filterSID)) IS NULL) OR 
于 2011-06-15T19:49:17.017 回答