2011-06-15 35 views
2

我具有由一个存储过程包裹此SQL函数问题:SQL SERVER - 与COALESCE()函数

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对错误负责。

编辑:现在,我得到了错误的原因......并给了我其实有很多params的事实...你们会推荐什么解决方案?

回答

8

COALESCE

Return Types

Returns the data type of expression with the highest data type precedence. If all expressions are nonnullable, the result is typed as 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

认同这一点,并希望它不会事实证明,两个参数只是一个例子,实际上有二十个参数(因此使用COALESCE的想法可能起源于此)... – 2011-06-15 19:26:36

+0

感谢您的快速响应......并且Andriy说: ...我在那里有很多参数,认为使用COALESCE来实现这一点很好。我应该避免使用它吗? – Learner 2011-06-16 10:03:28

+1

@Cristi - 如果你想使用COALESCE,我会为每个数据类型使用一个COALESCE表达式(例如,把你所有的varchar参数放在一个COALESCE中,所有的ints放入另一个),并且它不会尝试执行任何操作类型转换。 – 2011-06-16 10:24:36

3

尝试在Coalesce转换参数Varchar
例如:

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

谢谢你......我明白你的观点,但我认为太长而又丑陋了......我想我会选择达米安提出的建议,但有没有其他解决办法? – Learner 2011-06-16 10:12:51