Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Shkval Гость
|
Добавлено: Пт Фев 20 2004 16:27 Заголовок сообщения: Хранимая процедура в MS SQL Server |
|
|
Всем привет.
Если кто знает, подскажите, пожалуйста, можно ли как-нибудь использовать результат вызова процедуры как таблицу. Вот что я имею ввиду: если у нас имеется табличная хранимая на сервере функция sf_Func(), то мы можем выполнить такой запрос:
SELECT * FROM TABLE1 T1, TABLE2 T2, sf_Func()
WHERE ...
т. е. таблицу, возвращаемую функцией sf_Func() мы объеденяем с таблицами Table1, Table2. А если у нас есть хранимая процедура sp_Proc, то ее мы запускаем при помощи инструкции EXECUTE, при этом такие запросы:
SELECT * FROM TABLE1 T1, TABLE2 T2, sp_Proc
WHERE ...
ИЛИ
SELECT * FROM TABLE1 T1, TABLE2 T2,
(EXECUTE sp_Proc)
WHERE ...
ИЛИ
INSERT INTO TABLE3
EXECUTE sp_Proc
Вызовут ошибку. Можно ли как-нибудь выполнить подобные запросы?
Заранее спасибо. |
|
Вернуться к началу |
|
 |
wildwind
Зарегистрирован: 03.02.2004 Сообщения: 268 Откуда: Москва
|
Добавлено: Пт Фев 20 2004 21:19 Заголовок сообщения: |
|
|
Толком объясни, че надо-то и зачем.
Не нравится процедура - переделай ее в функцию. Но о том, чтобы делать INSERT в результат функции, забудь. |
|
Вернуться к началу |
|
 |
cerber
Зарегистрирован: 19.12.2003 Сообщения: 296 Откуда: Казахстан, Актюбинск
|
Добавлено: Сб Фев 21 2004 08:02 Заголовок сообщения: |
|
|
А не проще выгружать результат работы процедуры в отдельную таблицу, и потом обьеденяй на здоровье. |
|
Вернуться к началу |
|
 |
Shkval Гость
|
Добавлено: Сб Фев 21 2004 21:55 Заголовок сообщения: |
|
|
cerber писал(а): | А не проще выгружать результат работы процедуры в отдельную таблицу, и потом обьеденяй на здоровье. |
Возможно, именно это и есть решение проблемы. Обьясни, пожалуйста, как это сделать (я имею ввиду, выгрузить результат работы процедуры в отдельную таблицу)? |
|
Вернуться к началу |
|
 |
Shkval Гость
|
Добавлено: Сб Фев 21 2004 22:28 Заголовок сообщения: |
|
|
wildwind писал(а): | Толком объясни, че надо-то и зачем.
|
Дело в том, что запрос к БД, который выполняется внутри процедуры, не является статическим, я формирую его динамически (в зависимости от значений параметров процедуры) как строку типа NVARCHAR(N) и выполняю при помощи процедуры sp_executesql (такой изврат приходится делать из-за особенностей предметной области, которые долго обьяснять). А затем таблицу, являющуюся результатом работы моей процедуры, необходимо будет объединять с другими таблицами (по типу INNER JOIN). Почему я немогу загнать все JOIN-ы в динамически формируемый запрос? Потому что такой запрос не единственный - их много, они однотипные; при этом формировать каждый из них динамически очень не хотелось бы, поэтому выделили наиболее общую часть всех однотипных запросов и решили запихнуть ее в хранимую процедуру, а результат уже join-ить с оставшимися индивидуальными таблицами.
wildwind писал(а): | Не нравится процедура - переделай ее в функцию. |
Вот в этом то и заключается вопрос. Как запихнуть результат работы процедуры sp_executesql (ЭТО ПРОЦЕДУРА, А НЕ ФУНКЦИЯ - я писал в чем проблема в начале темы) в таблицу и затем вернуть наружу из моей функции? |
|
Вернуться к началу |
|
 |
cerber
Зарегистрирован: 19.12.2003 Сообщения: 296 Откуда: Казахстан, Актюбинск
|
Добавлено: Пн Фев 23 2004 07:59 Заголовок сообщения: |
|
|
А структура возвращаемой таблицы постоянна?
Если постоянна то создаёшь таблицу(можно руками) и загоняешь туда данные, т.е. вычислил дату и ешё чего нибудь и insert'ом в таблицу.
Если не постоянна то в начале процедуры удаляешь таблицу и создаёшь её заново с нужной тебе структурой. |
|
Вернуться к началу |
|
 |
Hibernate Гость
|
Добавлено: Пн Фев 23 2004 13:05 Заголовок сообщения: Re: Хранимая процедура в MS SQL Server |
|
|
Shkval писал(а): |
Вот в этом то и заключается вопрос. Как запихнуть результат работы процедуры sp_executesql (ЭТО ПРОЦЕДУРА, А НЕ ФУНКЦИЯ - я писал в чем проблема в начале темы) в таблицу и затем вернуть наружу из моей функции? |
Код: | CREATE PROCEDURE sp_Test AS
Insert Into #Temp1 (I_D) Values (10)
GO |
Код: |
create Table #Temp1(I_D Int)
DECLARE @d nVarChar(100)
SET @d = N'exec sp_Test'
EXECUTE sp_executesql @d
Select * FROM #Temp1 |
а так не подойдет? |
|
Вернуться к началу |
|
 |
Shkval Гость
|
Добавлено: Ср Фев 25 2004 18:05 Заголовок сообщения: |
|
|
Да, все работает .
Всем спасибо. |
|
Вернуться к началу |
|
 |
|