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'(および他の場合はDEFAULT)?

COALESCEがエラーの原因であることに気づきました。

編集:エラーの理由がわかったので...そして実際にたくさんのパラメータがあるという事実を考えると...あなたたちは解決策として何をお勧めしますか?

4

2 に答える 2

8

COALESCE

返品タイプ

データ型の優先順位が最も高い式のデータ型を返します。すべての式がnull不可の場合、結果はnull不可として入力されます。

(強調が追加されました)。intはvarcharよりも優先順位が高いため、return型はCOALESCEint型である必要があります。そして明らかに、あなたの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

Coalesceパラメータをに変換してみてくださいVarchar
。例:

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