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

Откуда:
Сообщений: 388
Хранимая процедура возвращает несколько таблиц, как получить эти таблицы во временные?

Пример с одной таблицей
insert into #tmp(...) EXEC proc_main

а как получить 2 таблицы, которые она возвращает?
31 авг 09, 10:32    [7596234]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
dVirt
Хранимая процедура возвращает несколько таблиц, как получить эти таблицы во временные?

Пример с одной таблицей
insert into #tmp(...) EXEC proc_main

а как получить 2 таблицы, которые она возвращает?
На клиенте с помощью ADO
31 авг 09, 10:45    [7596345]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
zenik
Member

Откуда:
Сообщений: 100
Так пускай у тебя ХП сама запишет все селекты во временные таблицы.
31 авг 09, 10:45    [7596356]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
dVirt
Member

Откуда:
Сообщений: 388
Сформирую по другому:

Исторически сложилось так, что есть процедура которая возвращает 2 таблицы!

Нужно написать вторую процедуру постраничного разбиения данных второй таблицы первой процедуры.

Тоесть первая процедура возвращает 2 таблицы:
Таблица1
Таблица2

Нужно из тела другой процедуры вызвать первую и получить во временные таблицы те самые 2 результирующие таблицы.
31 авг 09, 10:53    [7596413]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
dVirt
Сформирую по другому
А зачем?
Если бы это можно было сделать с помощью чистого T-SQL, не трогая текст процедуры, Вам давно бы об этом рассказали.
31 авг 09, 10:57    [7596445]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Два датасета в одной ХП - извращение. :)
31 авг 09, 11:30    [7596701]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
dVirt
Member

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

А кто сказал про 2 датасета?
31 авг 09, 13:43    [7597814]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
iap
Member

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

А кто сказал про 2 датасета?
А что такое "возвращает несколько таблиц",
Как это таблицу можно "вернуть"?

Может, перейдёте на русский?
31 авг 09, 13:46    [7597829]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
dVirt
Member

Откуда:
Сообщений: 388
iap
dVirt
LSV,

А кто сказал про 2 датасета?
А что такое "возвращает несколько таблиц",
Как это таблицу можно "вернуть"?

Может, перейдёте на русский?


Элементарно, читайте MSDN там всё написано. В итоге данные из хранимой процедуры возвращаются в приложение, а там они представлены в виде DataSet, у которого может содержаться несколько таблиц, в каждой из которых множество строк. Это стандартная терминология разработчика, это не совсем "русский язык" как Вы подумали ...

Так я и не понял как может возвращаться два дата сета? Ведь это и есть структура верхнего уровня для приложения!

ВОТ статьи из MSDN:
http://msdn.microsoft.com/ru-ru/library/system.data.dataset.aspx
31 авг 09, 13:59    [7597920]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
zenik
Member

Откуда:
Сообщений: 100
Так сразу и ответили...
Class 
TCustomADODataSet 

Syntax 


[Delphi] function NextRecordset(var RecordsAffected: Integer): _Recordset;


Description 
Call NextRecordset in situations where multiple recordsets are returned to provide access to the second (and subsequent) recordsets. The ADO Recordset object returned by NextRecordset must be assigned to the Recordset property of an ADO dataset component, such as TADODataSet , to be accessible.
 [Delphi]ADODataSet1.Recordset := ADOQuery1.NextRecordset
[C++]ADODataSet1->Recordset = ADOQuery1->NextRecordset;
RecordsAffected is the number of rows in the returned recordset.
31 авг 09, 14:06    [7597999]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
dVirt
Member

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

Это Вы вообще что за пример привели и к чему???

Вы статью в MSDN читали?

и вообще причём здесь Delphi?
вы бы ещё на Java пример привели ... или на ассемблере ... :)
31 авг 09, 14:11    [7598045]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
zenik
Member

Откуда:
Сообщений: 100
Причем тут делфи? Какой хелп был ближе, оттуда и скопировал. Смысл в том, что у DataSet есть функция NextRecordSet, которая будет перемещать на "вторую таблицу". Или опять не понятно?
31 авг 09, 14:30    [7598218]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
zenik
Member

Откуда:
Сообщений: 100
Вот из MSDN, который читать см не хочешь: http://msdn.microsoft.com/ru-ru/library/system.data.dataset.tables.aspx
31 авг 09, 14:33    [7598236]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
dVirt
Member

Откуда:
Сообщений: 388
zenik
Вот из MSDN, который читать см не хочешь: http://msdn.microsoft.com/ru-ru/library/system.data.dataset.tables.aspx

Ну вот видите, Вы сами привели ссылку на коллекцию таблиц, а не дата сетов!!! Я об этом и говорил, читайте выше ...

zenik
Причем тут делфи? Какой хелп был ближе, оттуда и скопировал. Смысл в том, что у DataSet есть функция NextRecordSet, которая будет перемещать на "вторую таблицу". Или опять не понятно?

Уважаемый, Вы что то путаете и очень сильно ...

Функция NextRecordSet у класса DataSet - ОТСУТСТВУЕТ !!!
Вот список всех доступных методов класса DataSet, из оффициальной MSDN:
http://msdn.microsoft.com/ru-ru/library/system.data.dataset_methods.aspx

Отсюда следует, что DataSet это самый верхний и самый главный сериализуемый класс в иерархии отсоеденённых источников данных, пространства имён "System.Data". Он может содержать множество таблиц DataTable и отношений между ними. Каждая таблица может содержать множество строк DataRow с данными, и столбцов DataColumn, на пересечении которых находятся ячейки с данными.
31 авг 09, 14:48    [7598378]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
andy st
Member

Откуда:
Сообщений: 796
dVirt
...

истина как всегда рядом
31 авг 09, 14:58    [7598444]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
dVirt
Member

Откуда:
Сообщений: 388
andy st
dVirt
...

истина как всегда рядом


Ха, так это совсем другая тема ...

Цитата из MSDN:
"Считывает поток строк последовательного доступа из источника данных."

Вот описание класса содержащего этот метод:
http://msdn.microsoft.com/ru-ru/library/system.data.common.dbdatareader.aspx

Ключевым является словосочетание "последовательного доступа", а мы говорим про DataSet, а значит про отсоеденённый источник данных!

zenik утверждал, что в классе "DataSet есть функция NextRecordSet".

И вообще вопрос не в том в каком классе, и что содержится, а про хранимую процедуру. iap помоему очень однозначно ответил на этот вопрос. Тему можно считать закрытой.
Ниже уже флуд!
31 авг 09, 15:11    [7598562]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
начался тупой умниковый флуд... :)

упоминая DataSet я имел ввиду табличный набор данных. Не таблицы и не АДОшные классы.

Возможно правильнее было сказать РезултСет.

Не понимаю причин для создания таких ХП. Много проблем с совместимостью и реинжинирингом.
31 авг 09, 15:19    [7598608]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
LSV
начался тупой умниковый флуд... :)

упоминая DataSet я имел ввиду табличный набор данных. Не таблицы и не АДОшные классы.

Возможно правильнее было сказать РезултСет.

Не понимаю причин для создания таких ХП. Много проблем с совместимостью и реинжинирингом.
Ну, можно же представить себе создание нескольких временных таблиц перед вызовом процедуры.
Эти таблицы заполняются данными в процессе выполнения процедуры.
А по окончании обрабатываются оказавшиеся в них данные.
Это самый надёжный и законный способ. Но он требует полного соответствия структуры таблиц и текста процедуры.
Если же в разных местах процедуры понаставлены какие-то SELECTы "в никуда",
то получаем много проблем, начиная с доступа к этим резалтсетам и кончая необходимостью работать с данными неизвестной структуры.
31 авг 09, 15:47    [7598790]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
Var79
Member

Откуда:
Сообщений: 890
LSV
начался тупой умниковый флуд... :)

упоминая DataSet я имел ввиду табличный набор данных. Не таблицы и не АДОшные классы.

Возможно правильнее было сказать РезултСет.

Не понимаю причин для создания таких ХП. Много проблем с совместимостью и реинжинирингом.


удобно для "автоматического" (с помощью указаия атрибутов на класе/членах) мапигна entities

например получить список организаций с телефонами, выбираем 2 набора, организации и телефоны, а спец "инструмент" сам добавляет в каждую организацию свои телефоны,
можно кончечно одним дата сетом, но в 2 датасета ответ может быть более компакнтым
31 авг 09, 15:48    [7598797]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
step_ks
Member

Откуда:
Сообщений: 936
LSV

Не понимаю причин для создания таких ХП. Много проблем с совместимостью и реинжинирингом.

Бывает удобно. Для сложных документов, например. Шапка, куча признаков на шапку, строки документа, каждая строка разбита еще на детализацию. Запускается одна ХП с ID документа и вся выборка готова. А если на каждый резалтсет вызывать свою ХП то может случиться так, что придется продублировать много одинакового кода (формирующего данные, необходимые для селектов - переменные или временные таблицы), а то и вообще может быть условный select в зависимости от @@rowcount предыдущего. Или еще пример: вызывается одна ХП, вызывающая кучу других. Каждая отдает на клиента отчет о своей работе. Клиент все собирает и показывает вместе одним отчетом.
31 авг 09, 15:55    [7598849]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
step_ks
Бывает удобно. Для сложных документов, например. Шапка, куча признаков на шапку, строки документа, каждая строка разбита еще на детализацию. Запускается одна ХП с ID документа и вся выборка готова. А если на каждый резалтсет вызывать свою ХП то может случиться так, что придется продублировать много одинакового кода (формирующего данные, необходимые для селектов - переменные или временные таблицы), а то и вообще может быть условный select в зависимости от @@rowcount предыдущего. Или еще пример: вызывается одна ХП, вызывающая кучу других. Каждая отдает на клиента отчет о своей работе. Клиент все собирает и показывает вместе одним отчетом.
Странное удобство, ИМХО :)
Что мешает сделать две ХП ?
А если второй ДС в данный момент не нужен ?
А если нужен только второй ДС (например нажали рефреш строчной части) ?
В сложных шапках/строках вообще принято подчитывать только по необходимости. У меня есть документы, где есть десятки наборов строк (ссылки на связанные документы). Не читать же их все сразу !

Можно ли использовать такую "двойную" ХП внешними приложениями (например Crystal Report) ? Шота сомневаюсь.
1 сен 09, 18:55    [7605330]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура возвращает несколько таблиц  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 2252
>dVirt, 31 авг 09, 10:32 [7596234]
>Хранимая процедура возвращает ...

Для своих нужд поступил так (реализация страничной подкачки):
- гп - static class (глобальные параметры)
- бом - static class (библиотека общих методов)

        string Sel_0 = "SELECT COUNT(*) FROM спкСообщения"+stWHERE;
        string Sel_1 = 
          "INSERT INTO #gdTmp(GUID) SELECT гдСообщение as GUID"+
          " FROM (SELECT TOP " + iTop.ToString() + " гдСообщение," +
          " ROW_NUMBER() OVER (ORDER BY стСообщение) as nRow FROM спкСообщения " + stWHERE + ") s"+
          " WHERE (s.nRow > " + iRecords.ToString()+")";
        
        //-- Строим двойную выборку
        idxCatch = 1; //-- Возможна ошибка задания параметров
        гп.cmm.Parameters.Clear();
        гп.cmm.Parameters.Add("@Sel_0", SqlDbType.NText).Value = Sel_0;
        гп.cmm.Parameters.Add("@Sel_1", SqlDbType.NText).Value = Sel_1;
        гп.cmm.CommandText = "au_Сообщения_Sel";
        гп.cmm.CommandType = CommandType.StoredProcedure;
        
        idxCatch = 2; //-- Возможна ошибка сервера данных
        гп.sdr = гп.cmm.ExecuteReader();

        //-- Получим полный объём строк в выборке сообщений из первой выборки
        idxCatch = 3; //-- Возможна ошибка получения объема полной выборки
        while(гп.sdr.Read()){
          iВыборка = гп.sdr.GetInt32(0);
        }
        //-- Возможно ошибки не будет = (byte)0, резервируем место
        //-- Число строк в полной выборке = (int)0, резервируем место
        //-- Число строк в странице текущей странице = (int)0, резервируем место
        byte[] bt=new byte[9]{0,0,0,0,0,0,0,0,0};
        ams.Write(bt,0,bt.Length);
        i = 0;  //-- Счетчик числа строк в текущей странице выборки
       
        //-- Переходим к анализу страницы
        idxCatch = 4; //-- Возможна ошибка перехода к данным страницы 
        гп.sdr.NextResult();

        //-- Сериализуем страницу из второй части выборки
        бом.BitDBNullRow=new byte[1]{0};
        
        //-- Сериализуем строки выборки из таблицы спкСообщения 
        //-- Цикл чтения строк выборки из таблицы спкСообщения
        idxCatch = 5; //-- Возможна ошибка сериализации данных страницы
        while (гп.sdr.Read()) {
          //-- Моя сериализация
          бом.xms = new MemoryStream(1024);

С уважением, Владимир.
p.s. Извини что не коротко.
Мне надо сериализовать строки.
Можешь строки выборок в циклах перенести во временные таблицы
2 сен 09, 11:25    [7607087]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить