Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.28;
Скачать: CL | DM;

Вниз

Набор данных как результат хранимой процедуры   Найти похожие ветки 

 
Bless   (2003-07-02 12:49) [0]

Есть хранимая процедура, которая набор данных.
Как к этому результирующему запросу обратиться?

Например, в другом запросе:
select * from MyStoredProc


 
Семен Сорокин ©   (2003-07-02 12:57) [1]

TStoredProc + F1


 
Smashich ©   (2003-07-02 13:18) [2]

хранимая процедура или функция?


 
MOA ©   (2003-07-02 13:34) [3]

Из запроса к процедуре никак. Можно к функции, если у Вас SQL2000.


 
Bless   (2003-07-02 15:38) [4]

:( У меня SQLServer 7.0

Так что, никак нельзя добраться к результату работы процедуры?


 
sniknik ©   (2003-07-02 15:55) [5]

Bless (02.07.03 15:38)
> Так что, никак нельзя добраться к результату работы процедуры?
просто MyStoredProc или exec MyStoredProc вернет рекордсет если он в ней конечно возврашается.
без всякой мороки
зачем использовать неопределенные для процедур конструкции? смысл? чего хочеш добится? а то может все не так уж и плохо, если разбирать конкретную задачу а не "тупичок" в общем.


 
Семен Сорокин ©   (2003-07-02 16:00) [6]

2Bless
см. Семен Сорокин © (02.07.03 12:57) :))


 
Stas ©   (2003-07-02 16:59) [7]

Попробуй в запросе EXECUTE MyProc
Если есть параметры, то укажи их через запятую.


 
Bless   (2003-07-02 17:32) [8]

>sniknik © (02.07.03 15:55)

Вот почти конкретная задача.

Есть куча строительных объектов, между которыми существуют иерархические отношения(типа родитель-потомок). То есть, например, объекты "Временная плотина подводящего канала", "Подводящий канал с устоями" - части объекта "ГАЭС" и в свою очередь могут состоять из других подобъектов и т.д.
Информация об этих связях берется из двух полей: kod - код объекта,
parent - код родителя

Нужно вывести, к примеру, список всех работ по объекту "ГАЭС"
Естесственно, все работы на "временной плотине..." и т.п. тоже считаются работами на "ГАЭС"

Всех потомков объекта с таким-то кодом планирую выбирать хранимой процедурой MyStoredProc. Код передается в качестве параметра процедуры. Тогда SQL-запрос будет выглядеть приблизительно так

select work.name
FROM work, MyStoredProc
where work.Obj_kod =MyStoredProc.kod :Object




>Stas © (02.07.03 16:59)
>Попробуй в запросе EXECUTE MyProc

Пробовал. Не работает.


 
sniknik ©   (2003-07-02 18:19) [9]

Bless (02.07.03 17:32)
не совсем то о чем я думал
мне бы не описание твоей работы а конкретно чего хотел добится этим
select * from MyStoredProc

данные в гриде показать?, дальнейшая обработка? на сервере и т.д.

>> Попробуй в запросе EXECUTE MyProc
> Пробовал. Не работает.
а ты попробуй не свою которая возможно ничего не возвращает (как бы хорошо ты о ней не думал), а системную которая точно работает правильно. например EXEC SP_WHO


 
Fay   (2003-07-02 19:05) [10]

А что не работает? Что за ошибка-то?


 
Bless   (2003-07-03 10:51) [11]

>sniknik © (02.07.03 18:19)
>мне бы не описание твоей работы а конкретно чего хотел добится
>этим select * from MyStoredProc.

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

select work.name
FROM work, MyStoredProc
where work.Obj_kod =MyStoredProc.kod :Object

, где в параметре :Object - код объекта, все подобъекты которого надо получить.

>а ты попробуй не свою которая возможно ничего не возвращает
> (как бы хорошо ты о ней не думал), а системную которая точно
>работает правильно. например EXEC SP_WHO

Если написать
select * from sp_who
или
select * from exec sp_who
или
select * from (exec sp_who),

то не работает


 
sniknik ©   (2003-07-03 11:02) [12]

> Если написать
select * from sp_who
....
то не работает

естественно, ведь надо писать EXEC SP_WHO, именно так без всяких дополнений.
(вот ты говориш написал вроде ясно, но у тебя конструкция нерабочая а вроде как тебе хотелось бы чтобы работало, вымысел короче без обьяснения что от него хочеш, я написал код гораздо короче в 2 слова абсолютно рабочий и ты меня не понял, догадываешся теперь насколько мне понять сложнее?)

select с процедурами не применим, insert в некоторых случаях позволяется. (ну применительно к коду вышепреведенному)


 
MOA ©   (2003-07-03 11:06) [13]

В 2000 можно воспользоваться функциями. В Вашем случае (7) возможны 2 варианта:
1. Оформить Ваши запросы в виде процедур, которые будут вызывать процедуру получения потомков примерно так:
EXEC ваша_процедура @ID_Object INTO #временная_таблица
- так можно. Некоторые делают все запросы приложения через процедуры (именно - все запросы), и считают, что так правильнее, чем запросами. В чём-то они правы - особенно в части безопасности и поддержки.
2. Если проект ещё недалеко продвинулся, можно изменить представление дерева, например, на основе вложенных множеств - тогда для выбора потомков не понадобится процедура. Но зато она понадобится при вставках-удалении.
Удачи!


 
sniknik ©   (2003-07-03 11:26) [14]

MOA © (03.07.03 11:06)
вариантов гораздо больше, зависит от того что именно делается.


 
MOA ©   (2003-07-03 11:35) [15]

>sniknik
Согласен.


 
Bless   (2003-07-03 12:55) [16]

>естественно, ведь надо писать EXEC SP_WHO, именно так без
>всяких дополнений.
>(вот ты говориш написал вроде ясно, но у тебя конструкция
>нерабочая а вроде как тебе хотелось бы чтобы работало, вымысел
>короче без обьяснения что от него хочеш, я написал код гораздо
>короче в 2 слова абсолютно рабочий и ты меня не понял,

>MOA ©
>EXEC ваша_процедура @ID_Object INTO #временная_таблица

Именно то, что надо. Спасибо.

>2. Если проект ещё недалеко продвинулся, можно изменить
>представление дерева, например, на основе вложенных множеств -
>тогда для выбора потомков не понадобится процедура. Но зато она
>понадобится при вставках-удалении.

:)Для практики сделаю оба, благо время не поджимает.
А если есть ссылки на информацию о других способах организации иерархических данных в реляционных базах, то поделитесь плз


 
MOA ©   (2003-07-03 13:33) [17]

Юссылки на информацию о других способах организации иерархических данных

http://www.osp.ru/win2000/sql/2001/05/967.htm
http://www.osp.ru/win2000/sql/2001/05/968.htm

Удачи!


 
KSergey ©   (2003-07-03 14:03) [18]

>EXEC ваша_процедура @ID_Object INTO #временная_таблица

Это что еще за фокусы? Что-то не нашел я в справке такого синтаксиса, да и не работает оно у меня (MSSQL 7). Я что-то не так делаю?
Например, в QA:

exec sp_who into #t

Ответ сервера: "а не пошел бы ты нафиг со своим INTO?!" (Incorrect syntax near the keyword "into".)

Что не так?


 
MOA ©   (2003-07-03 14:06) [19]

И ещё:
http://www.pwr.ru/items/?id=3
http://sdm.viptop.ru/articles/sqltrees.html


 
MOA ©   (2003-07-03 14:19) [20]

Пардон.
INSERT таблица EXEC процедура

Пример из справки

--INSERT...EXECUTE procedure example
INSERT author_sales EXECUTE get_author_sales

Ещё раз пардон. нечистый попутал ;)




 
olden69 ©   (2003-07-03 14:21) [21]

USE northwind
GO

create procedure dbo._test
as
select top 10 * from region
GO

GRANT EXECUTE ON [dbo].[_test] TO [public]
GO

SELECT a.*
FROM OPENROWSET("SQLOLEDB","MyServer";"sa";"sapassword",
"exec northwind.dbo._test") AS a
GO


 
olden69 ©   (2003-07-03 14:33) [22]

логично переделать из


select work.name
FROM work, MyStoredProc
where work.Obj_kod =MyStoredProc.kod :Object


в


select work.name
FROM work, MyStoredProc
where dbo.IsChildOf(Work.Obj_kod,:Object)=1


осталось только правильно написать функцию определения потомок ли
первый объект второго

запрос перечня объектов - Query1
запрос перечня работ на указанном объекте - Query2
и связать их Master-Detail по параметру Query2->:Object и полю Query1->Object


 
sniknik ©   (2003-07-03 14:38) [23]

MOA © (03.07.03 14:19)
это ответ на другой вопрос. (как занести результат работы процедуры в таблицу?)
а был
Набор данных как результат хранимой процедуры [D7, MSSQL]
...
select * from MyStoredProc

olden69 © (03.07.03 14:21)
подходит, результат этого ничем не отличается от простого EXEC _test (вернет такой же набор данных, только немного "попозже")

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


 
olden69 ©   (2003-07-03 14:55) [24]

вариант с OPENROWSET позволяет не создавать специально для выборки из результата одной процедуры еще одну процедуру (ради копирования во временную таблицу)
а обойтись просто селектом

но это на любителя
что "быстрее?легче?нагляднее?красивше?" - это уж как кому нравится


 
KSergey ©   (2003-07-03 16:49) [25]

По поводу варианта с OpenRowset: вот только какие ресурсы потребуются для подключения сервера самого к себе через OLE... Про безопасность вообще молчу - явно в SQL-тексте написан пароль
Хотя как поучительный вариант - безусловно интересен. (лишь мое мнение)


 
olden69 ©   (2003-07-03 17:38) [26]

будем надеятся что в YUKON Microsoft реализует синтаксис типа

SELECT * FROM (EXECUTE MyStoredProc)


 
Bless   (2003-07-04 09:05) [27]

Что такое YUKON?


 
olden69 ©   (2003-07-04 16:19) [28]

http://www.compulenta.ru/2003/6/26/40396/



Страницы: 1 вся ветка

Текущий архив: 2003.07.28;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.017 c
11-91697
MTsv DN
2002-11-23 13:04
2003.07.28
Компонент MHComPort


14-91895
Князь Мышкин
2003-07-11 15:10
2003.07.28
Где достать исходники Делфи


14-91834
Dmitriy O.
2003-07-10 08:54
2003.07.28
Можно ли по зрительно представить человека по тексту


3-91634
Bless
2003-07-02 12:49
2003.07.28
Набор данных как результат хранимой процедуры


3-91661
Vi-Vi
2003-07-03 16:31
2003.07.28
Как добавить поле програмным путем?