(SQL) Почему функция не возвращает абсолютно ничего?

maximovega

На основе возвращаемых функцией данных программа вытягивает из базы результаты (для каждой группы имён, фамилий, возрастов и так далее генерирует код и для каждого конкретного кода считает сумму комиссий). Вопрос в том, что не все имена заполнены, некоторые значения полей попросту NULL. В таком случае программа генерирует по умолчанию код ошибки X. Насколько я смогла разобраться, хотя бы X возврашается в любом случае, за это отвечает выделенная строка. Тем не менее, на одной строке данных DWH не возврашается ни X, ни даже NULL, просто ничего!
Текст функции:
ALTER FUNCTION [dbo].[CODE] (@NAME VarChar(5 @MAIN VarChar(5 @INS Int, @ID VarChar(50
RETURNS VarChar(50)
AS
BEGIN
DECLARE @code VarChar(50)
IF @ID = 'NNN' BEGIN SET @ID = '_' END
WHILE LEN(@NAME) < 3
BEGIN SET @NAME = @NAME + '_' END
IF @INS = -1
BEGIN SET @code = 'E_' END
ELSE BEGIN SET @code = 'T_' END
IF @ID IN ('A','B')
BEGIN
IF @NAME IN ('100') SET @code = @code + 'R'
END
ELSE
BEGIN
IF @NAME IN ('200') SET @code = @code + 'Q'
ELSE
SET @code = 'X' END (!!!)
IF @code <> 'X'
BEGIN
SET @code = @code + 'B'
END
IF @code <> 'X' BEGIN SET @code = @code + '_' + @ID END
RETURN(@code)
END
Все параметры корректны, лишь @NAME входит со значением NULL.
Чего не понимаю достаточно хорошо? Чего не замечаю?

val63

Вбей такое, и те станет все понятно:
declare @code varchar(50)
set @code = @code + 'blablah'
select @code
@code у тебя объявляется, но не инициализируется, соответственно имеет значение null
null + 'строка' = null
Вот и возвращает null.
Тебе надо после объявления сделать так:
set @code = ''

hprt

Функция НЕ может не возвращать ничего. Ты даже не сможешь создать функцию, в которой return не на последнем месте - т.е. даже казалось бы правильный код на самом деле неверен
 
if @tmp = 1
return 1
else
return 2

hprt

на это пофиг на самом деле :) при null просто цикл ни одной итерации не сделает, а дальше там в проверках куда-нибудь да попадет

maximovega

Да, это я проверила, ты прав. :)
Но я действительно не вижу, почему вообще может появиться NULL... Разве этот кусок кода не убережёт от этого?
IF @INS = -1
BEGIN SET @code = 'E_' END
ELSE BEGIN SET @code = 'T_' END
И эта строка тоже его как-то инициализирует, разве нет?
SET @code = 'X'

fedya

Можно пример вызова функции с параметрами, когда возвращается NULL?

zorin29

У меня есть подозрение, что функция правильная.
Может быть, ты ее используешь в каком-то SQL коде, который делает INNER JOIN (тогда "потерянная" строчка потерялась до вызова функции) ?
Короче говоря, показывай вызывающий код.

0000

Если функция многократному использованию не подлежит, то ее без проблем переписать обычной SQL-кой с использованием CASE.
Мне кажется выполняться малек побыстрее будет, ну и не столь путанно.

select ...
case
when ins = -1 then 'E_'
default 'T_'
end case
||
case
when (id = 'A' or id = 'B') and name = '100' then 'R'
when id <> 'A' and id <> 'B' and name = '100' then 'Q'
end case
...

hprt

Да скалярные функции вообще зло :) Где возможно, надо переписывать на табличные-инлайн. Скорость инлайн-функций будет примерно такая же, как просто в запросе, тогда как скалярные функции рушат производительность в разы. Для сравнения можно посмотреть например
Оставить комментарий
Имя или ник:
Комментарий: