我有一个由存储过程包装的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对错误负责。

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

最佳答案

COALESCE

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

(添加了强调)。 int比varchar的higher precedence要大,因此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)

关于sql-server - SQL Server-COALESCE()函数问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6361114/

10-16 00:20