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

Откуда:
Сообщений: 196
Добрый день. Сейчас активно изучаю T-SQL. До этого программировал в Firebird и теперь не понятны некоторые нюансы в MS SQL.
В чём разница?
Между:
CREATE PROC ProcName
AS
BEGIN
   SELECT * FROM TableName;
END
и
CREATE FUNCTION FuncName()
RETURNS TABLE
AS
BEGIN
   RETURN (SELECT * FROM TableName);
END
И вообще часто ли используются селективные процедуры в MS SQL или для этих случаев лучше функции?
10 окт 11, 10:44    [11410840]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
Glory
Member

Откуда:
Сообщений: 104751
GTS_ST
В чём разница?

Конкретно тут разница - в возможностях вызова

GTS_ST
И вообще часто ли используются селективные процедуры в MS SQL или для этих случаев лучше функции?

Каких - "этих случаев" ?
У процедур и функций свой набор ограничений
10 окт 11, 10:48    [11410868]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
GTS_ST,

Основная разница:

Процедуры могут модифицировать внутри себя данные, а функции нет

ну и по мелочам
Функции можно использовать в where\having

результат функции можно использовать как join к другому сету
10 окт 11, 10:48    [11410869]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
GTS_ST
Member

Откуда:
Сообщений: 196
Наверно не правильно объяснил задачу. У нас например (firebird) всё построено на ХП. Даже выбор из базы. Так вот хочется знать, то использовать в MS SQL для выборки функции или процедуры? Не пойму в чем разница их применения для клиентского места. Именно для селекта.
10 окт 11, 10:52    [11410899]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
Glory
Member

Откуда:
Сообщений: 104751
GTS_ST
Так вот хочется знать, то использовать в MS SQL для выборки функции или процедуры?

Что лучше подходит, то и использовать
10 окт 11, 10:54    [11410916]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
GTS_ST
Так вот хочется знать, то использовать в MS SQL для выборки функции или процедуры? Не пойму в чем разница их применения для клиентского места. Именно для селекта.
Лучьше использовать процедуры - это более универсально.

Функции в MS SQL используются, если результат нужно использовать не на клиенте, а на сервере.
10 окт 11, 10:55    [11410935]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
GTS_ST
Member

Откуда:
Сообщений: 196
Glory
GTS_ST
Так вот хочется знать, то использовать в MS SQL для выборки функции или процедуры?

Что лучше подходит, то и использовать

Ну вот к примеру есть таблица:

ID int PK,
Name varchar(255),
Ordinal int

Мне нужно отбирать записи по параметру Ordinal. Что для этого лучше функция или процедура?
10 окт 11, 10:56    [11410942]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
Glory
Member

Откуда:
Сообщений: 104751
GTS_ST
Что для этого лучше функция или процедура?

Еще раз - разница в синтакисе вызова. Вы знаете, какой синтаксис вызова для вас лучше ?
10 окт 11, 10:58    [11410952]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
iljy
Member

Откуда:
Сообщений: 8711
alexeyvg,

не всегда можно заранее сказать, придется использовать результат на сервере или нет. Посмотрите, сколько на форуме тем про невозможность вложенного INSERT EXEC!

GTS_ST,

вопрос выбора на самом деле довольно сложный. Если есть один SELECT, то более универсально обернуть его в инлайн-функцию. В конце концов для эстетов (или для экономии на компиляциях) можно дополнительно сделать процедуру, которая будет эту функцию вызывать.
Если же выборка более сложная, то вопрос запутывается. Не, понятно, что если нужна модификация или динамика, то это почти однозначно процедура. А вот если модификаций нет, но идет несколько выборок с промежуточной обработкой, ветвлениями и т.п.... Табличная неинлайн-функция применима очень ограничено, в основном когда результирующий набор данных маленький.
10 окт 11, 11:03    [11410998]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
GTS_ST
Member

Откуда:
Сообщений: 196
Glory,
Синтаксис вызова на клиенте не принципиален. Я просто не пойму как к примеру будет выглядеть процедура равносильная функции:
CREATE FUNCTION FuncName()
RETURNS @Result TABLE
(ID int,
NAME varchar(32))
AS
BEGIN
   INSERT INTO @Result Values(1,'Name_1');
   INSERT INTO @Result Values(2,'Name_2');
   RETURN;
END
10 окт 11, 11:09    [11411040]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
GTS_ST
Glory,
Синтаксис вызова на клиенте не принципиален. Я просто не пойму как к примеру будет выглядеть процедура равносильная функции:
CREATE FUNCTION FuncName()
RETURNS @Result TABLE
(ID int,
NAME varchar(32))
AS
BEGIN
   INSERT INTO @Result Values(1,'Name_1');
   INSERT INTO @Result Values(2,'Name_2');
   RETURN;
END

CREATE PROCEDURE ProcName()
AS
DECLARE @Result TABLE
(ID int,
NAME varchar(32))
   INSERT INTO @Result Values(1,'Name_1');
   INSERT INTO @Result Values(2,'Name_2');
   SELECT * FROM @Result
   RETURN;
10 окт 11, 11:14    [11411078]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
iljy
Member

Откуда:
Сообщений: 8711
GTS_ST
Glory,
Синтаксис вызова на клиенте не принципиален. Я просто не пойму как к примеру будет выглядеть процедура равносильная функции:
CREATE FUNCTION FuncName()
RETURNS @Result TABLE
(ID int,
NAME varchar(32))
AS
BEGIN
   INSERT INTO @Result Values(1,'Name_1');
   INSERT INTO @Result Values(2,'Name_2');
   RETURN;
END

CREATE PROCEDURE ProcName()
AS
   SELECT * FROM (Values(1,'Name_1'),(2,'Name_2')) t(ID, Name);
   RETURN;
10 окт 11, 11:17    [11411098]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
GTS_ST
Member

Откуда:
Сообщений: 196
Всем большое спасибо. Вроде разобрался. Мне всё-таки показалось, что использование функций более универсально для селектов.
10 окт 11, 11:23    [11411155]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
Return?
Guest
а объясните плиз новичку.
вот может тут дело в том, что начинаю изучение сразу с 2005,
а не с 2000, может это оттуда еще идет, или почему на форуме
все время вижу в конце процедуры RETURN.
а в БОЛ почему-то нет
BOL:
USE AdventureWorks;
GO
IF OBJECT_ID ( 'HumanResources.uspGetAllEmployees', 'P' ) IS NOT NULL 
    DROP PROCEDURE HumanResources.uspGetAllEmployees;
GO
CREATE PROCEDURE HumanResources.uspGetAllEmployees
AS
    SELECT LastName, FirstName, JobTitle, Department
    FROM HumanResources.vEmployeeDepartment;
GO


и в том малом,
что мной написано, RETURN нет, а вроде работает все равно.
т.е. вот тут, например,
iljy
CREATE PROCEDURE ProcName()
AS
   SELECT * FROM (Values(1,'Name_1'),(2,'Name_2')) t(ID, Name);
   RETURN;


мне даже в голову не пришло бы написать RETURN,
но вот написано же, и явно опытным человеком...
10 окт 11, 14:33    [11413004]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Return?,

RETURN присваивает результирующему параметру число целого типа.
Обычно его называют кодом завершения (можно возвращать код ошибки).
Если завершение нормальное, обычно возвращают 0.
0 возвращается и в том случае, когда RETURN в явном виде не указан.
Этот параметр обычно проверяется сразу после вызова процедуры.
IMHO, сейчас, когда появились блоки TRY/CATCH, это не так актуально.
10 окт 11, 14:40    [11413065]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
Return?
Guest
спасибо, iap!
у меня было такое подозрение,
потому что при всем при том, что я совсем не пишу RETURN при возвращении результата SELECT-а,
если потом не ручками прописать вызов процедуры, а сгенерить его с помощью Management Studio,
мне дописывалось нечто типа
declare @Result int; exec myProc; select @Result as Res
и да, туда возвращался 0.
т.е. не дописывая RETURN,
я потенциально теряю код ошибки, если процедура завершится аварийно?
а тем, кто дописал RETURN, его вернут автоматом,
или им тоже ничего не вернут, т.к. они не позаботились вписать явно возврат именно кода ошибки?
10 окт 11, 14:49    [11413145]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Return?
мне дописывалось нечто типа
declare @Result int; exec myProc; select @Result as Res
и да, туда возвращался 0.
т.е. не дописывая RETURN,

Такой код ничего не может присвоить в @Result

Return?
я потенциально теряю код ошибки, если процедура завершится аварийно?
а тем, кто дописал RETURN, его вернут автоматом,

RETURN не имеет никакого отношения к аварийному завершению кода
И он не возвращает никакой код ошибки
Это логический код завершения процедуры

Сообщение было отредактировано: 10 окт 11, 14:57
10 окт 11, 14:57    [11413222]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
Return?
Guest
пардон, значит генерилось такое:
declare @Result int; @Result = exec myProc; select @Result as Res
студии под рукой нет, но если очень надо, из дома в точности скопирую, чего генерит.

Glory
Это логический код завершения процедуры

ну отлично.
вот я и спрашиваю.
почему в БОЛ для 2005-ого сервера в статье о процедурах нет этого логического кода завершения.
а код 0 мне возвращает без RETURN и из дома картинку завешу, раз не верите.
студия генерит: если на процедуре по правой кнопке выбрать "выполнить" и потом открыть сгенеренный скрипт в новом окне и там запустить
10 окт 11, 15:11    [11413385]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Return?
вот я и спрашиваю.
почему в БОЛ для 2005-ого сервера в статье о процедурах нет этого логического кода завершения.

Какого "этого" ?
Вы сами определяете, какие кода и по какой логике должна возвращать ваша процедура

MSSQL может отвечать только за свои системные процедуры
Unless documented otherwise, all system stored procedures return a value of 0. This indicates success and a nonzero value indicates failure.

Return?
а код 0 мне возвращает без RETURN и из дома картинку завешу, раз не верите.

Для того, чтобы верили, нужно приводить точный скрипт кода
И еще внимательно читать ответы. Я сказал "Такой код ничего не может присвоить в @Result". А не то, что return ничего не возвращает
10 окт 11, 15:15    [11413438]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
Return?
Guest
ок. со всем соглашаюсь.
подытоживая. толку от написания в конце процедуры RETURN без указания какого-либо значения
ровно столько же, сколько и от ненаписания RETURN?
10 окт 11, 15:25    [11413540]     Ответить | Цитировать Сообщить модератору
 Re: Объясните разницу  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
Return?
ок. со всем соглашаюсь.
подытоживая. толку от написания в конце процедуры RETURN без указания какого-либо значения
ровно столько же, сколько и от ненаписания RETURN?
Да.
10 окт 11, 15:52    [11413808]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить