Sql server SQL SERVER-COALESCE()函数存在问题

Sql server SQL SERVER-COALESCE()函数存在问题,sql-server,coalesce,sql-function,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, @fi

我有一个由存储过程包装的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造成的

编辑:现在我知道了错误的原因。。。事实上我有很多情妇。。。你们推荐什么解决方案?

返回类型

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

(重点补充)。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)

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

例如:

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

同意这一点,并希望不会出现两个参数只是一个示例,实际上有二十个参数(使用COALESCE的想法可能就是从这里产生的)…感谢您的快速响应。。。正如安德烈所说。。。我有很多参数,我认为使用COALESCE来实现这一点会很好。我应该避免使用它吗?@Cristi-如果你想使用COALESCE,我会对每个数据类型使用一个COALESCE表达式(例如,将所有varchar参数放在一个COALESCE中,将所有int放在另一个COALESCE中),它不会尝试执行任何类型转换。是的,我明白你的意思。。。谢谢,达米恩。顺便说一句,我会接受你的回答,因为这正是我想要的,但我想再等一等,看看别人是否会推荐其他解决我问题的方法。干杯达米恩,我有一个简短的问题。。。我注意到我的逻辑是错误的,我需要一个“and”来代替“there”。所以,如果设置了一个过滤器参数(NOTNULL),则在where子句中使用它,否则不使用。如果我有多个参数,如何做到最好。你能给我一个如何实现这一目标的建议吗?谢谢谢谢你。。。我明白你的意思,但我觉得太长太丑了。。。我想我会选择Damien的建议,但有没有别的解决办法?