2011-06-15 30 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