SQL SERVER - Проблемы с функцией COALESCE () - PullRequest
2 голосов
/ 15 июня 2011

У меня есть эта функция 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 ответственен за ошибку.

РЕДАКТИРОВАТЬ: Теперь, когда я получил причину ошибки ... и учитывая тот факт, что у меня действительно много параметров ... что вы, ребята, порекомендовали бы в качестве решения?

Ответы [ 2 ]

8 голосов
/ 15 июня 2011

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)
3 голосов
/ 15 июня 2011

Попробуйте преобразовать параметры в Coalesce в Varchar
Например:

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