Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
Гость777
Guest
Добрый день.

Неплохо бы примерчик посмотреть и почитать хорошую статейку на эту тему, возможно существует не один вариант реализации.

Заранее благодарен
24 сен 14, 11:10    [16614510]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Процедура ничего не знает про DataSet-ы.
Все, что возвращается клиентскому предложению, возвращается через пару стандартных команд. Вроде SELECT
24 сен 14, 11:12    [16614525]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Гость777,

Просто написать в процедуре SELECT. И всё!
24 сен 14, 11:12    [16614533]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
Гость777
Guest
Glory,

не совсем понятно о чём речь.
Можешь привести рабочий пример хранимой процедуры?
24 сен 14, 11:14    [16614548]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
да хоть так:
/***********************************/
/* PROCEDURE   : ReadOneContract                       */
/* DESCRIPTION :                                             */
/**************************************/
PRINT 'CREATE PROCEDURE ReadOneContract...'
GO

if exists (select *
           from sysobjects
           where id = object_id('ReadOneContract'))
	drop procedure ReadOneContract
GO

CREATE PROCEDURE ReadOneContract
(@con_code      udd_code)
AS

/*      Read contract           */
SELECT
   con_code           = Contract.con_code,
   con_customer     = Contract.con_customer
FROM Contract
WHERE con_code = @con_code
GO
24 сен 14, 11:14    [16614556]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
Гость777
Guest
iap
Гость777,

Просто написать в процедуре SELECT. И всё!


Непонятно, что будет возвращаться... надо живой пример посмотреть
24 сен 14, 11:15    [16614563]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Гость777
Непонятно, что будет возвращаться... надо живой пример посмотреть

Что напишите, то и будет возвращать
Пример как всегда есть в хелпе, в стаье CREATE PROCEDURE
24 сен 14, 11:17    [16614580]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
Гость777
Guest
Glory
Гость777
Непонятно, что будет возвращаться... надо живой пример посмотреть

Что напишите, то и будет возвращать
Пример как всегда есть в хелпе, в стаье CREATE PROCEDURE


Не совсем понятно что писать?

CREATE PROCEDURE [MyProc]
  @MyDataSet   ??? OUTPUT
AS
... и что тут писать?
GO


Но это получается пол вопроса, как этот датасет получить на клиенте, использую FireDAC на XE6. Неплохо бы почитать статейку на эту тему... но таковых не нашёл, помогите
24 сен 14, 11:25    [16614640]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Гость777
Glory
пропущено...

Что напишите, то и будет возвращать
Пример как всегда есть в хелпе, в стаье CREATE PROCEDURE


Не совсем понятно что писать?

CREATE PROCEDURE [MyProc]
  @MyDataSet   ??? OUTPUT
AS
... и что тут писать?
GO



Но это получается пол вопроса, как этот датасет получить на клиенте, использую FireDAC на XE6. Неплохо бы почитать статейку на эту тему... но таковых не нашёл, помогите
Так вернуть таблицу из процедуры нельзя.
Можно только передать процедуре в параметре табличную переменную в режиме READONLY.
Начиная с SQL2008
24 сен 14, 11:28    [16614659]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Гость777
Не совсем понятно что писать?

Открыть хелп по CREATE PROCEDURE.
Изучить первый пример в ней.
24 сен 14, 11:29    [16614665]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Гость777
как этот датасет получить на клиенте, использую FireDAC на XE6. Неплохо бы почитать статейку на эту тему... но таковых не нашёл, помогите

Это вопрос к FireDAC на XE6, а не к MSSQL
24 сен 14, 11:30    [16614669]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
Гость777
Guest
iap,

Про табличные переменные я в курсе. Но их нельзя возвращать!

Скорей всего для возвращении DataSet'а надо использовать временную таблицу, но вот как это сделать не могу найти примера.
24 сен 14, 11:30    [16614676]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Гость777
Скорей всего для возвращении DataSet'а надо использовать временную таблицу, но вот как это сделать не могу найти примера.

И не найдете. Потому что его не существует.
24 сен 14, 11:31    [16614680]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Гость777
iap,

Про табличные переменные я в курсе. Но их нельзя возвращать!

Скорей всего для возвращении DataSet'а надо использовать временную таблицу, но вот как это сделать не могу найти примера.
1. Сначала создать временную таблицу.
2. Потом вызвать процедуру.
В процедуре временная таблица с именем из пункта 1 должна чем-то заполняться.
Тогда по завершении процедуры получите данные в созданной в п. 1 таблице.

Внимание! Не создавайте внутри процедуры временную таблицу с тем же именем, что и снаружи.
Иначе процедура будет видеть и заполнять только её. А у неё время жизни только до конца процедуры.
24 сен 14, 11:35    [16614702]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
Гость777
Guest
Glory
Гость777
Не совсем понятно что писать?

Открыть хелп по CREATE PROCEDURE.
Изучить первый пример в ней.


вот пример из справки + ёё вызов:
CREATE PROCEDURE HumanResources.uspGetAllEmployees
AS
    SET NOCOUNT ON;
    SELECT LastName, FirstName, JobTitle, Department
    FROM HumanResources.vEmployeeDepartment;
GO

EXEC HumanResources.uspGetAllEmployees;


Вопрос, почему нет возвращаемого параметра, но при этом что-то возвращается?

и ещё вопрос, если усложнить это дело:
Если внутри хранимой процедуры создать несколько временных таблиц, заполнить их, и потом сделать селект по ним, что-то вернётся?
24 сен 14, 11:45    [16614768]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Гость777
Вопрос, почему нет возвращаемого параметра, но при этом что-то возвращается?

Потому что для наборов данных НЕТ возвращаемых параметров. Бай дизайн
Все, что выберет SELECT, он вернет клиентскому приложению

Гость777
Если внутри хранимой процедуры создать несколько временных таблиц, заполнить их, и потом сделать селект по ним, что-то вернётся?

Еще раз.
Все, что выберет SELECT, он вернет клиентскому приложению.
24 сен 14, 11:47    [16614789]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
Гость777
Guest
Glory,

Тогда непонятно, если делаем приписку "SET NOCOUNT ON;" по идеи ничего возвращаться не должно...?

и ещё вопрос, может и не совсем по меркам данного форума, как отловить полученный датасет в дельфях? Если была такая практика подскажи
24 сен 14, 11:55    [16614859]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Гость777
Тогда непонятно, если делаем приписку "SET NOCOUNT ON;" по идеи ничего возвращаться не должно...?

Читать надо описание команды в хелпе. А не придумывать самому, что бы могла делать та или иная команда

Гость777
и ещё вопрос, может и не совсем по меркам данного форума, как отловить полученный датасет в дельфях?

Это совсем не по меркам данного форума
24 сен 14, 11:58    [16614877]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Гость777
как отловить полученный датасет в дельфях?
Сделать компоненту TStoredProcedure Open (а не ExecSQL!).
Или компонент TADOStoredProc открыть... И т.п.
24 сен 14, 12:04    [16614905]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Гость777
Вопрос, почему нет возвращаемого параметра, но при этом что-то возвращается?
Вы наверное раньше работали с другими СУБД.

В MSSQL и Sybase принят другой подход - из процедур (и любых батчей) в клиент возвращаются все наборы данных, возврат которых написан как SELECT (и ещё как некоторые операторы)

То есть просто пишите произвольное количество SELECT внутри процедуры, и клиентское приложение получит все эти наборы данных.

Гость777
и ещё вопрос, если усложнить это дело:
Если внутри хранимой процедуры создать несколько временных таблиц, заполнить их, и потом сделать селект по ним, что-то вернётся?
Да, вернутся все наборы данных - из постоянных таблиц, из временных таблиц, вообще без таблиц.
24 сен 14, 12:39    [16615178]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
Гость777
Guest
alexeyvg
Гость777
Вопрос, почему нет возвращаемого параметра, но при этом что-то возвращается?
Вы наверное раньше работали с другими СУБД.

В MSSQL и Sybase принят другой подход - из процедур (и любых батчей) в клиент возвращаются все наборы данных, возврат которых написан как SELECT (и ещё как некоторые операторы)

То есть просто пишите произвольное количество SELECT внутри процедуры, и клиентское приложение получит все эти наборы данных.

Гость777
и ещё вопрос, если усложнить это дело:
Если внутри хранимой процедуры создать несколько временных таблиц, заполнить их, и потом сделать селект по ним, что-то вернётся?
Да, вернутся все наборы данных - из постоянных таблиц, из временных таблиц, вообще без таблиц.


Спасибо за полное пояснение.

У меня вопрос про несколько наборов данных. При выполнении хранимки на клиенте (например через TADOStoredProc) мне интересно какой набор данных получит компонент, первый или последний... или вовсе можно их как-то перебирать?

и ещё вопрос, если в теле хранимой процедуры SELECT используется например для извлечения параметров, например так:
...
DECLARE @P INT
DECLARE @Y INT

SELECT
  @P = [Test1],
  @Y = [Test2]
FROM
  [Primer]
...


Этот датасет так же передаётся клиенту?
и
если есть необходимость, то как это можно закрыть
24 сен 14, 13:05    [16615435]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Гость777
и ещё вопрос, если в теле хранимой процедуры SELECT используется например для извлечения параметров, например так:
...
DECLARE @P INT
DECLARE @Y INT

SELECT
  @P = [Test1],
  @Y = [Test2]
FROM
  [Primer]
...



Этот датасет так же передаётся клиенту?

Это - не набор данных. Это команда присвоения значения переменным.
24 сен 14, 13:07    [16615453]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
Гость777
Guest
Glory,
спасибо, теперь всё понятно...

а,
про несколько наборов данных. При выполнении хранимки на клиенте (например через TADOStoredProc) мне интересно какой набор данных получит компонент, первый или последний... или вовсе можно их как-то перебирать?
24 сен 14, 13:11    [16615485]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Гость777
У меня вопрос про несколько наборов данных. При выполнении хранимки на клиенте (например через TADOStoredProc) мне интересно какой набор данных получит компонент, первый или последний... или вовсе можно их как-то перебирать?
Все, с первого до последнего.
Как перебирать - спрашивайте в форуме по клиенту. Или в хелпе по объектам доступа к данным; думаю, можно за несколько минут найти что то вроде GetNextResultset
Гость777
Этот датасет так же передаётся клиенту?
Вы же при написании, отладке процедур пользуйтесь SSMS?

Вот всё, что вы после выполнения процедуры видите на панели результатов, возвращается клиенту.
SSMS - такой же клиент, как и ваш на Delphi, программисты прользовались точно такими же библиотеками доступа, ничего "тайного, специально для микрософта" у них нету.
24 сен 14, 13:14    [16615499]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать хранимую процедуру с возвращающим DataSet'ом  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Гость777
Glory,
спасибо, теперь всё понятно...

а,
про несколько наборов данных. При выполнении хранимки на клиенте (например через TADOStoredProc) мне интересно какой набор данных получит компонент, первый или последний... или вовсе можно их как-то перебирать?
По умолчанию - последний.
Но в ADO есть возможность переключиться на другие, если есть.
24 сен 14, 13:15    [16615509]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить