#sql #sql-server #database #postgresql
Вопрос:
Привет всем, я создал функцию масштабирования, в которой я хочу передать параметр @aCOURSENAME как null, но когда я пытаюсь выполнить его без параметра, он выдает ошибку недостаточного параметра. почему это происходит, хотя я передаю null в качестве параметра в функцию
Вот моя функция
CREATE FUNCTION UFN_XX_GETSTUCOUNT_ONCOURSE(@aCOURSENAME VARCHAR(20) = NULL) RETURNS INT AS BEGIN RETURN (SELECT COUNT(SID) AS STUDENT FROM BATCH B INNER JOIN ENROLLMENT E ON B.BATCHID = E.BATCHID INNER JOIN COURSE C ON C.COURSEID = B.COURSEID WHERE COURSENAME = @aCOURSENAME GROUP BY COURSENAME) END GO
SELECT DBO.UFN_XX_GETSTUCOUNT_ONCOURSE()
без параметра, когда я выполняю, он выдает ошибку недостаточного параметра.
Комментарии:
1. Я думаю, что вам все равно нужно будет пройти
null
илиDEFAULT
2. О какой СУБД идет речь в вашем запросе? Это SQL-сервер? Пожалуйста, всегда помечайте свои SQL-запросы своей СУБД.
3. Если ваш параметр равен нулю, то ваше
WHERE
условие неверно. Так и должно бытьWHERE COURSENAME IS NULL
. Для того, чтобы это сработало, вам нужна функция объединенияNULL
, которая заменит действительное значение.
Ответ №1:
Вы не можете опускать параметры при вызове определяемых пользователем функций SQL(*). Да, я знаю, что это воняет, и я понятия не имею, почему это так (вероятно, какое-то устаревшее решение в синтаксическом анализаторе SQL, принятое 30 лет назад). Тем не менее, вы либо должны явно передать значение NULL:
SELECT DBO.UFN_XX_GETSTUCOUNT_ONCOURSE(NULL)
или «неявно» , используя значение ПО УМОЛЧАНИЮ:
SELECT DBO.UFN_XX_GETSTUCOUNT_ONCOURSE(DEFAULT)
И да, мы все ненавидим это и жалуемся на это десятилетиями.
(* — досадно, но некоторые системные функции допускают необязательные аргументы)
Комментарии:
1. Большое Тебе спасибо, Рбарриен .