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

Откуда: Москва
Сообщений: 94
Подскажите, пожалуйста, как сделать правильно следующую вещь:
Хранимая процедура возвращает данные во временную таблицу
Мне надо вызывая ее в другой хранимой процедуре получить эту таблицу
Так вот :)) как же это делается?
Так как sql server начала осваивать недавно, надеюсь не осудите строго за такие глупые вопросы :))
25 фев 05, 22:43    [1346611]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, мне глупой !!!!  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
Для чего необходим подобный подход? Во-первых временные таблицы работают относительно медленно! Во-вторых временные таблицы #tmp доступны в области одного коннекшена - поэтому смотрите сами подойдутли вам такие таблицы или стоит использовать ##tmp - но тогда Вам придется скорее всего плодить таблицы ##tmp... У меня была задача которую я сначала тоже решал через временные таблицы - однако потом отказался от них и решил динамически создавать таблицы в БД, с индексами и т.п. - соответственно после окончания работы программы удалять их (но тут были большие объемы данных)

Myster
Подскажите, пожалуйста, как сделать правильно следующую вещь:
Хранимая процедура возвращает данные во временную таблицу
Мне надо вызывая ее в другой хранимой процедуре получить эту таблицу
Так вот :)) как же это делается?
Так как sql server начала осваивать недавно, надеюсь не осудите строго за такие глупые вопросы :))


Вам наверное стоит пересмотреть такой подход... лучше в одном запросе получать необходимые данные - нежели их сохранять во временную таблицу...

Если вы опишете подробнее стоящую перед Вами задачу - то будет гораздо проще что-либо посоветовать... Нежели стараться придумать изначально нерациональный подход
26 фев 05, 00:12    [1346665]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, мне глупой !!!!  [new]
Myster
Member

Откуда: Москва
Сообщений: 94
Вот в том то и вся проблемма что временная таблица сразу после выполнения процедуры, в которой она создается, становится не доступной
Я бы с удовольствием от нее отказалась, но не знаю чем ее заменить :((
Один селект мне не подходит, так как данные которые я записываю во врем таблицу получаю кучей вычеслений.... и ладно бы было если бы их просто надо было вывести... мне в дальнейшем надо с ними работать, например вызывать в другой процедуре и посторочно обрабатывать.
Временная таблица понятно для этого не предназначина, так подскажите с чем вы работаете в таких случаях? и если не трудно пришлите кусок кода для примера

Обьемы данных большие, одновременно могут обращаться к этим процедурам десятки пользователей
26 фев 05, 10:33    [1346833]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, мне глупой !!!!  [new]
unicode
Member

Откуда:
Сообщений: 810
а вы приведите кож вышего селекта и процу созадющую таблицу временную
26 фев 05, 11:31    [1346876]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, мне глупой !!!!  [new]
unicode
Member

Откуда:
Сообщений: 810
чтобы временная таблица была доступна в другой процедуре нужно использовать не #table а ##table
26 фев 05, 11:34    [1346878]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, мне глупой !!!!  [new]
PVP
Member

Откуда: Украина, г.Сумы
Сообщений: 832
SanyL
Во-первых временные таблицы работают относительно медленно!
На чем основано такое утверждение? Работа с временными таблицами происходит быстрее, т.к. все операции выполняются в TempDb, не трогая журнал транзакций.

SanyL
Во-вторых временные таблицы #tmp доступны в области одного коннекшена
«#», т.е. локальные временные таблицы доступны со всех процедур и функций, вызываемых из той, где эта таблица создана.

SanyL
стоит использовать ##tmp - но тогда Вам придется скорее всего плодить таблицы ##tmp
. Почему надо плодить? Это хороший вариант для создания временной таблицы, к которой будет доступ от разных пользователей. В отличие от локальной, которая создается для каждого «юзера», глобальная временная таблица является общей для всех пользователей. Она уничтожается, когда от нее отключается последний пользователь. Доступ к ней возможен со всех вызываемых процедур.

SanyL
динамически создавать таблицы в БД, с индексами
.На временных таблицах также можно создавать и использовать индексы.

Myster

Я бы с удовольствием от нее отказалась, но не знаю чем ее заменить …
Обьемы данных большие, одновременно могут обращаться к этим процедурам десятки пользователей
На мой взгляд, Вы делаете правильно. Решите, какая временная таблица Вам нужна (локальная или глобальная). Если это локальная, то создайте вначале ее в процедуре, которая является общей для всех остальных. Если глобальная, то не важно, где она будет создана.
26 фев 05, 11:39    [1346884]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, мне глупой !!!!  [new]
unicode
Member

Откуда:
Сообщений: 810
локальная таблица доступна в текущем коннекте но если ваш коннекшн открыветься и закрываеться слишком часто то нужно будет использовать глобальную временную таблицу.. а при закрытие приложения уничтожить ее дабы не "портить" tempdb...
26 фев 05, 11:46    [1346888]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, мне глупой !!!!  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
Ответ неоднозначный!

Дело в том, что все зависит от того как часто необходимо пересчитывать эти данные - допустим, у меня есть набор процедур которые выводят данные о состоянии работы склада - соответственно необходимо каждый раз заново все просчитывать (большие изменения за короткое время).

Количество пользователей которые будут работать - значительное... - надо понять стоитли им каждый раз этот кусок пересчитывать или же его проще посчитать раз в сутки а далее они будут с этими данными работать (например для ревизоров - они в основном работают с проблемами которые произведены были раньше = потерян товар на складе когдато) - соответственно тут можно создать постоянную таблицу и job'om запускать процедупу которая будет ее заполнять...

Я писал в перемешку с дельфями - так что не факт что мой кусок кода вам подойдет - но некоторые наметки дам:
1)..........блин чтото странное немогу найти - вобщем я пользовал чтото типа TABLE_SCHEMA - но не могу найти ни где описания - вобщем смысл такой = Вобщем надеюсь меня поправят те кто будут читать и понимают что я имел ввиду
2)проверял наличие таблицы в БД - если нет создавал и работал с ней (ну например с именем tmp1) - если есть то создавал с именем tmp2 и т.д. = соответственно каждый пользователь имел свою таблицу tmp* - после выхода из программы она соответственно удалялась!

3) посмотрите тут:1 и тут 2 = не ленитесь почитайте - полистайте, может найдете уже готовое решение вашей задачи - а если нет то кроме пользы ничего не принесет!
26 фев 05, 12:09    [1346900]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, мне глупой !!!!  [new]
Myster
Member

Откуда: Москва
Сообщений: 94
спасибо вам большое! теперь все понятно :-))
26 фев 05, 12:10    [1346905]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, мне глупой !!!!  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
2PVP
Myster

Обьемы данных большие, одновременно могут обращаться к этим процедурам десятки пользователей


PVP
Работа с временными таблицами происходит быстрее, т.к. все операции выполняются в TempDb, не трогая журнал транзакций.

Ну если во временной таблице - небольшое количество записей! А если, как сказано данные большие - то только при условии что человек станет создавать кодом таблицу с индексами а не как обычно SELECT * INTO # - таких не часто встретишь (большинству пофиг).

PVP
Во-вторых временные таблицы #tmp доступны в области одного коннекшена «#», т.е. локальные временные таблицы доступны со всех процедур и функций, вызываемых из той, где эта таблица создана.
см. написанное unicode

PVP
Почему надо плодить? Это хороший вариант для создания временной таблицы, к которой будет доступ от разных пользователей. В отличие от локальной, которая создается для каждого «юзера», глобальная временная таблица является общей для всех пользователей. Она уничтожается, когда от нее отключается последний пользователь. Доступ к ней возможен со всех вызываемых процедур.
Ну я же пытался получить описание стоящей задачи! Если например строится отчет который часто запускают десятки пользователей на простяжении раб дня - то как быть в случае если почти одновременно запустили два разных пользователя рассчет отчета? (данные могут меняться каждую долю секунды)
26 фев 05, 12:28    [1346919]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, мне глупой !!!!  [new]
Myster
Member

Откуда: Москва
Сообщений: 94
единственное если не сложно приведите пожалуйста пример создания глобальной временной таблицы и локальной
26 фев 05, 12:28    [1346920]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, мне глупой !!!!  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
F1 -> Create Table

только имя начинается с # или ##
26 фев 05, 12:30    [1346922]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, мне глупой !!!!  [new]
PVP
Member

Откуда: Украина, г.Сумы
Сообщений: 832
Myster
единственное если не сложно приведите пожалуйста пример создания глобальной временной таблицы и локальной

Они создаются как и обычные таблицы:
- глобальная: create table ##NameGL_Table (....)
- локальная: create table #NameLoc_Table (....)

Или еще:
Select * into ##NameGL_Table from ...
Select * into #NameLoc_Table from ...

От обычных таблиц они отличаются тем, что у локальной перед именем стоит один знак '#', а у глобальной - два.
26 фев 05, 12:35    [1346924]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, мне глупой !!!!  [new]
Myster
Member

Откуда: Москва
Сообщений: 94
клево!

а я создавала в процедуре таблицу во так:

declare @tabl table (параметры)

понятно одно что надо еще читать и читать что пишут умные люди ))
26 фев 05, 12:40    [1346927]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, мне глупой !!!!  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
@xxx - так выглядят переменные
26 фев 05, 13:54    [1346977]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, мне глупой !!!!  [new]
AAron
Member

Откуда: Москва
Сообщений: 4324
2Myster
Все это конечно классно было рассказано. А теперь по существу.
Есть процедура (InnerProc), которая производит некие вычисления и заполняет временную таблицу.
create procedure dbo.InnerProc
as
begin
create table #tmp (...)
...
insert into #tmp values (...)
end
Задача. получить во внешней (OuterProc) процедуре содержимое таблицы #tmp. Для этого можно воспользоваться как минимум двумя способами.
1. Создать таблицу #tmp не в процедуре IP, а в вызывающей ее. Тогда процедура IP заполнит временную таблицу и в процедуре OP будут все необходимые данные.
2. В приведенной выше процедуре InnerProc необходимо добавить в конце процедуры SELECT ... from #tmp. Во внешней процедуре OuterProc создать перед вызовом временную таблицу (или табличную переменную), идентичную по структуре выходному рекордсету. Затем вызвать процедуру InnerProc вот таким способом INSERT INTO @tmp exec InnerProc, получив при этом все данные во временную таблицу (или табличную переменную).
26 фев 05, 19:45    [1347254]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, мне глупой !!!!  [new]
VladRUS.ca
Member

Откуда: Toronto
Сообщений: 1172
Myster
...Я бы с удовольствием от нее отказалась, но не знаю чем ее заменить :((
Один селект мне не подходит, так как данные которые я записываю во врем таблицу получаю кучей вычеслений.... и ладно бы было если бы их просто надо было вывести... мне в дальнейшем надо с ними работать, например вызывать в другой процедуре и посторочно обрабатывать...

Я думаю Вам подойдет Examples: E. Use an OUTPUT cursor parameter из BOL:CREATE PROCEDURE т.к. результат все равно подлежит построчной обработки.
А ещё в качестве альтернативного варианта (даже передача данных в другой connection) можно использопать постоянную таблицу с полем net_address (разграничение не по connections а по сетевым карточкам), очищая ее перед каждым новым заполнением.
Этот приём использую в реальных проектах более 5 лет - работает довольно надёжно
27 фев 05, 08:03    [1347500]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить