Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Неверно работает UDF  [new]
Leierkastenmann
Member

Откуда: Москва
Сообщений: 113
Версия Microsoft SQL Server 2000 - 8.00.2187 (Intel X86)

Есть к примеру вот такая функция.
create function TestFunction(@i int)
returns int as
begin

declare @tab table (c int)
insert @tab values (2)
insert @tab values (300)

declare @j int

set @j = @i * 10

if @j < 50
	begin
		return isnull(
				(select top 1 c from @tab  where c > 100)
				,11)
	end

return @j

end

Функция разумеется вымышленная, в реальности выглядит сложнее, но суть не меняется. Выполняем два селекта и получаем для первого странный результат
select dbo.TestFunction(1)
select dbo.TestFunction(10)

----------- 
10
----------- 
100

Ткните, пожалуйста, где написано, что при return'e нельзя использовать такие конструкции с запросами. Если вместо return поставить присвоение результата запроса возвращаемой переменной, то все работает как надо.
5 ноя 09, 15:05    [7886463]     Ответить | Цитировать Сообщить модератору
 Re: Неверно работает UDF  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Leierkastenmann
Ткните, пожалуйста, где написано, что при return'e нельзя использовать такие конструкции с запросами. Если вместо return поставить присвоение результата запроса возвращаемой переменной, то все работает как надо.
Во-первых, неоднократно обсуждалось, что лучше делать ОДИН RETURN в функции. Иначе бывает глюк.
Во-вторых, TOP 1 без ORDER BY - это моветон.
5 ноя 09, 15:13    [7886529]     Ответить | Цитировать Сообщить модератору
 Re: Неверно работает UDF  [new]
Leierkastenmann
Member

Откуда: Москва
Сообщений: 113
iap
Leierkastenmann
Ткните, пожалуйста, где написано, что при return'e нельзя использовать такие конструкции с запросами. Если вместо return поставить присвоение результата запроса возвращаемой переменной, то все работает как надо.
Во-первых, неоднократно обсуждалось, что лучше делать ОДИН RETURN в функции. Иначе бывает глюк.
Во-вторых, TOP 1 без ORDER BY - это моветон.


Я же написал, что функция вымышленная. Ясное дело, что в реальности топы с ордерами.

В данном конкретном случае глюк не в количестве, а в том, что после return. Если там поставить возврат простого числа, то все работает.

Ну обсуждалось так обсуждалось, я в этом особо и не сомневался. Тема закрыта.
5 ноя 09, 16:18    [7887087]     Ответить | Цитировать Сообщить модератору
 Re: Неверно работает UDF  [new]
Glory
Member

Откуда:
Сообщений: 104760
Leierkastenmann

Ткните, пожалуйста, где написано, что при return'e нельзя использовать такие конструкции с запросами. Если вместо return поставить присвоение результата запроса возвращаемой переменной, то все работает как надо.

BOL - CREATE FUNCTION

Syntax
Scalar Functions

CREATE  FUNCTION [ owner_name. ] function_name 
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

RETURNS scalar_return_data_type

[ WITH < function_option> [ [,] ...n] ]

[ AS ]

BEGIN
function_body
RETURN scalar_expression
END

5 ноя 09, 16:39    [7887367]     Ответить | Цитировать Сообщить модератору
 Re: Неверно работает UDF  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Leierkastenmann
iap
Leierkastenmann
Ткните, пожалуйста, где написано, что при return'e нельзя использовать такие конструкции с запросами. Если вместо return поставить присвоение результата запроса возвращаемой переменной, то все работает как надо.
Во-первых, неоднократно обсуждалось, что лучше делать ОДИН RETURN в функции. Иначе бывает глюк.
Во-вторых, TOP 1 без ORDER BY - это моветон.


Я же написал, что функция вымышленная. Ясное дело, что в реальности топы с ордерами.

В данном конкретном случае глюк не в количестве, а в том, что после return. Если там поставить возврат простого числа, то все работает.

Ну обсуждалось так обсуждалось, я в этом особо и не сомневался. Тема закрыта.
Ну, вот, например: функция не выходит по return
5 ноя 09, 16:43    [7887414]     Ответить | Цитировать Сообщить модератору
 Re: Неверно работает UDF  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Glory
Leierkastenmann

Ткните, пожалуйста, где написано, что при return'e нельзя использовать такие конструкции с запросами. Если вместо return поставить присвоение результата запроса возвращаемой переменной, то все работает как надо.

BOL - CREATE FUNCTION

Syntax
Scalar Functions

CREATE  FUNCTION [ owner_name. ] function_name 
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

RETURNS scalar_return_data_type

[ WITH < function_option> [ [,] ...n] ]

[ AS ]

BEGIN
function_body
RETURN scalar_expression
END

Но подзапрос с TOP 1 - это ведь тоже "scalar_expression" ?
5 ноя 09, 16:48    [7887463]     Ответить | Цитировать Сообщить модератору
 Re: Неверно работает UDF  [new]
Glory
Member

Откуда:
Сообщений: 104760
Читаем дальше

The following statements are allowed in the body of a multi-statement function. Statements not in this list are not allowed in the body of a function:

- Assignment statements.
- Control-of-Flow statements.
- DECLARE statements defining data variables and cursors that are local to the function.
- SELECT statements containing select lists with expressions that assign values to variables that are local to the function

В моем понимании это означает, что конструкция return (select ...) вообще бы не должна работать. Поскольку никуда ничего не присваивает
5 ноя 09, 16:58    [7887560]     Ответить | Цитировать Сообщить модератору
 Re: Неверно работает UDF  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Glory
В моем понимании это означает, что конструкция return (select ...) вообще бы не должна работать. Поскольку никуда ничего не присваивает
Обычно оператор RETURN, как раз-таки, не только завершает выполнение процедуры/функции, а и присваивает значение выходной переменной.
Обычно такая переменная - временная и без имени (например, в C её можно использовать только сразу после возврата из функции)
А, например, в Pascalе к ней можно обратиться и по имени внутри функции (там это имя совпадает с именем функции).
Но, может, я ошибаюсь...
5 ноя 09, 17:08    [7887666]     Ответить | Цитировать Сообщить модератору
 Re: Неверно работает UDF  [new]
Glory
Member

Откуда:
Сообщений: 104760
iap
Glory
В моем понимании это означает, что конструкция return (select ...) вообще бы не должна работать. Поскольку никуда ничего не присваивает
Обычно оператор RETURN, как раз-таки, не только завершает выполнение процедуры/функции, а и присваивает значение выходной переменной.
Обычно такая переменная - временная и без имени (например, в C её можно использовать только сразу после возврата из функции)
А, например, в Pascalе к ней можно обратиться и по имени внутри функции (там это имя совпадает с именем функции).
Но, может, я ошибаюсь...

А что есть "выходная переменная" в предложенной выше функции ?
5 ноя 09, 17:12    [7887693]     Ответить | Цитировать Сообщить модератору
 Re: Неверно работает UDF  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Glory
iap
Glory
В моем понимании это означает, что конструкция return (select ...) вообще бы не должна работать. Поскольку никуда ничего не присваивает
Обычно оператор RETURN, как раз-таки, не только завершает выполнение процедуры/функции, а и присваивает значение выходной переменной.
Обычно такая переменная - временная и без имени (например, в C её можно использовать только сразу после возврата из функции)
А, например, в Pascalе к ней можно обратиться и по имени внутри функции (там это имя совпадает с именем функции).
Но, может, я ошибаюсь...

А что есть "выходная переменная" в предложенной выше функции ?
Если она не имеет имени и недоступна напрямую, то это не значит, что её нет.
Вы же согласны, что функция возвращает некоторое скалярное значение?
Значение без переменной существовать не может.
5 ноя 09, 17:21    [7887768]     Ответить | Цитировать Сообщить модератору
 Re: Неверно работает UDF  [new]
Glory
Member

Откуда:
Сообщений: 104760
iap
Glory
iap
Glory
В моем понимании это означает, что конструкция return (select ...) вообще бы не должна работать. Поскольку никуда ничего не присваивает
Обычно оператор RETURN, как раз-таки, не только завершает выполнение процедуры/функции, а и присваивает значение выходной переменной.
Обычно такая переменная - временная и без имени (например, в C её можно использовать только сразу после возврата из функции)
А, например, в Pascalе к ней можно обратиться и по имени внутри функции (там это имя совпадает с именем функции).
Но, может, я ошибаюсь...

А что есть "выходная переменная" в предложенной выше функции ?
Если она не имеет имени и недоступна напрямую, то это не значит, что её нет.
Вы же согласны, что функция возвращает некоторое скалярное значение?
Значение без переменной существовать не может.

И как мне присваивать в нее значения ? Какими командами ? Где вообще описан этот термин "выходная переменная" ? Я лично вижу только термин "возвращаемое значение"(return value), но нигде не вижу "output variable"
5 ноя 09, 17:30    [7887845]     Ответить | Цитировать Сообщить модератору
 Re: Неверно работает UDF  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Glory
iap
Glory
iap
Glory
В моем понимании это означает, что конструкция return (select ...) вообще бы не должна работать. Поскольку никуда ничего не присваивает
Обычно оператор RETURN, как раз-таки, не только завершает выполнение процедуры/функции, а и присваивает значение выходной переменной.
Обычно такая переменная - временная и без имени (например, в C её можно использовать только сразу после возврата из функции)
А, например, в Pascalе к ней можно обратиться и по имени внутри функции (там это имя совпадает с именем функции).
Но, может, я ошибаюсь...

А что есть "выходная переменная" в предложенной выше функции ?
Если она не имеет имени и недоступна напрямую, то это не значит, что её нет.
Вы же согласны, что функция возвращает некоторое скалярное значение?
Значение без переменной существовать не может.

И как мне присваивать в нее значения ? Какими командами ? Где вообще описан этот термин "выходная переменная" ? Я лично вижу только термин "возвращаемое значение"(return value), но нигде не вижу "output variable"
Ну, если привязываться к терминологии, то, может, я и неправ.
Просто я так сам себе объяснил, и это меня устроило.
Смотрите, в SQL2008 уже можно применять скалярный подзапрос практически всюду, где возможно скалярное выражение
(я имею в виду VALUES)
А в RETURN функций это всегда можно было.
5 ноя 09, 17:38    [7887907]     Ответить | Цитировать Сообщить модератору
 Re: Неверно работает UDF  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Читаем дальше

ну и что? у автора же не отдельный стейтмент, а подзапрос в составе
выражения.
к слову, в 2005-ом такая функция ведет себя правильно.

Posted via ActualForum NNTP Server 1.4

5 ноя 09, 17:50    [7887965]     Ответить | Цитировать Сообщить модератору
 Re: Неверно работает UDF  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Glory,

вообще-то, наблюдается противоречие:
с одной стороны, Вы считаете, что BOL неправильно описывает наблюдаемое отношение сервера к возвращаемому значению функции в команде RETURN,
а с другой стороны, надеетесь найти объяснение такого поведения в тексте этого самого BOL.
5 ноя 09, 17:57    [7887993]     Ответить | Цитировать Сообщить модератору
 Re: Неверно работает UDF  [new]
Glory
Member

Откуда:
Сообщений: 104760
iap
Glory,

вообще-то, наблюдается противоречие:
с одной стороны, Вы считаете, что BOL неправильно описывает наблюдаемое отношение сервера к возвращаемому значению функции в команде RETURN,
а с другой стороны, надеетесь найти объяснение такого поведения в тексте этого самого BOL.

Ошибка в одном предложении/параграфе хелпа не означает, что весь хелп неправильный
5 ноя 09, 17:58    [7888009]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить