Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Виртуальные таблицы в TSQL


Страницы:   1 2

MsGuns ©   (2009-01-20 12:40:00) 

Вопрос возник из-за отсутствия в TSQL конструкции Select from <StoredProc>

Есть запрос на выборку Select... на который нужно наложить дополнительное условие (Where, Join, In..) на соответствие некоторому набору значений поля (полей), определяемому хранимкой. Однако вставить в запрос на выборку непосредственно ХП нельзя. Если ХП сохранит результат во временной таблице #Table, то она "не видна" извне. Создавать на клиенте (в большинстве случаев запрос формируется на клиенте) временную таблицу и передавать ее имя в ХП не желательно по ряду причин.
Как выйти из тупика ?


Медвежонок Пятачок   (2009-01-21 12:18:00) [21]

declare @id int;
declare @xml varchar(max);
set @xml = '<root><item id="1"/><item id="2"/></root>';
exec sp_xml_preparedocument @id out,@xml;
select * from clients
where cl_id in (select id from openxml(@id,'/root/item',0) with (id int))
exec sp_xml_removedocument @id;

здесь вся разница с реальным случаем в том, что вызов хранимки заменен на простое присвоение set @xml = ....


Медвежонок Пятачок   (2009-01-21 12:11:00) [22]

иными словами вначале клиентского запроса задекларить две переменные int и varchar
выполнить процедуру, получить ее xml данные внутрь варчара.
далее exec sp_xml_preparedocument @id out,@xml;

далее выполнить клиентский запрос, а джойны евонные выполнять  к openxml(@id,'//......')


MsGuns   (2009-01-21 12:11:00) [23]

>Ega23 ©   (21.01.09 12:07) [12]

Не понял, каким боком в эту новую ХП я смогу встромить клиентский запрос с его (клиента) же списком where


Ega23   (2009-01-21 12:07:00) [24]


> Говоря иначе нельзя чтобы какие-то таблицы создавал сам
> клиент. Он должен просто выполнять запрос и все !


Напиши ещё одну ХП, суть которой сводится к:

1. Create table #xxx
2. insert into #xxx exec твоя_навороченная_процедура
3. Select * from #xxx со всеми джоинами.


Медвежонок Пятачок   (2009-01-21 12:01:00) [25]

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


MsGuns   (2009-01-21 11:48:00) [26]

Говоря иначе нельзя чтобы какие-то таблицы создавал сам клиент. Он должен просто выполнять запрос и все !

Ну уже вывернулся весь, объясняя суть - лучше не умею :)


MsGuns   (2009-01-21 11:45:00) [27]

>b z   (21.01.09 10:47) [6]
>Есть Select from <UserFunc>, - тоже не катит?

В теле функции нельзя взывать процедуры

>b z   (21.01.09 10:55) [7]
>+ Или вью организовать ... или то и то вместе :) вариант найти можно.

Дык в этом-то и вопрос заключается :)

>sniknik ©   (21.01.09 11:13) [8]
>что обсуждается TSQL или MSSQL? в описании не указано хотя потом вроде ссылки/синтаксис >MSSQL-я...
>если второе то

Да второе, конечно :)

>можно заменить на
> ...
>и не надо ничего передавать внутрь процедуры.

проблема в том, что та самая ХП достаточно навороченная (извлечение конструкторского состава изделия из графа констр.документации с кучей всяких нюансов: учет допустимых замен, расчет техотхода, определения маршрутов изготовления и т.д.) и не хотелось бы ее дублировать (именно ДУБЛИРОВАТЬ) аналогичной функцией.

шифр разузловываемого изделия, а также состав дополнительных (не относящихся к дереву состава) характеристик и условия выборки этих характеристик определяется на клиенте. Именно поэтому и возникла эта проблема. Т.к. кол-во клиентских приложений, юзающих дерево, весьма велико (и продолжает увеличиваться), хотелось бы придумать такой способ, который требовал бы минимальную ревизию проектов, вплоть до выноса текста самих запросов из IDE например на тот же сервер. В этом случае вообще проекты не надо было бы перекомпеллировать.
Но вот тут и вышла загвоздка.

Грубо говоря, есть некоторый select ... который возвращает то, что нужно задаче (приложению).
Этот селект приложение динамически дополняет условием Where исходя из текущих локальных требований пользователей. Все замечательно работает. Но работает ПО ВСЕЙ БАЗЕ. А надо чтоб только по изделию. Для чего и требуется "прикрутить" джоин к деталям и сборкам, относящимся к УКАЗАННОМУ изделию, а список этих самых деталей и сборок выдает та самая ХП.


sniknik   (2009-01-21 11:13:00) [28]

что обсуждается TSQL или MSSQL? в описании не указано хотя потом вроде ссылки/синтаксис MSSQL-я...

если второе то

> Т.е. ничего кроме
>
> Create Table #ttt...

> Exec .. ( вызов ХП с передачей имени таблицы параметром или "вшивка" в ХП имени #ttt)

>  <ХП заполняет таблицу>

> Select ... left Join #ttt on ...

> не получится ?

можно заменить на
Create Table #ttt...
insert #ttt exec "процедура возвращающая рекордсет"
Select ... left Join #ttt on ...
drop Table #ttt...
и не надо ничего передавать внутрь процедуры.


b z   (2009-01-21 10:55:00) [29]


> b z   (21.01.09 10:47) [6]
+ Или вью организовать ... или то и то вместе :) вариант найти можно.


b z   (2009-01-21 10:47:00) [30]


>  из-за отсутствия в TSQL конструкции Select from <StoredProc>
Есть Select from <UserFunc>, - тоже не катит?


Ega23   (2009-01-21 10:15:00) [31]


> При создании временной таблицы внутри ХП она будет автоматически
> >убита при выходе из ХП.


Создай её до вызова ХП и бкдет тебе щщастье.


> Т.е. ничего кроме


Боюсь что да.
Если эстетически не нравится - ну оберни это дело другой хранимкой, или в этой же отдельную моду сделай. В TSQL с хранимками весьма большие вольности позволительны, в отличие от какого-нибудь FB или Postgres


MsGuns   (2009-01-20 23:19:00) [32]

Т.е. ничего кроме

Create Table #ttt...

Exec .. (вызов ХП с передачей имени таблицы параметром или "вшивка" в ХП имени #ttt)

 <ХП заполняет таблицу>

Select ... left Join #ttt on ...


не получится ?


MsGuns   (2009-01-20 23:15:00) [33]

>Ega23 ©   (20.01.09 13:40) [2]
>> Если ХП сохранит результат во временной таблице #Table,
>> то она "не видна" извне.

>Это не так.

Как это "не так" сочетается с

>3. При создании временной таблицы внутри ХП она будет автоматически >убита при выходе из ХП.

?


Ega23   (2009-01-20 13:40:00) [34]


> Если ХП сохранит результат во временной таблице #Table,
> то она "не видна" извне.


Это не так.
1. В MSSQL есть два вида временных таблиц: #ttt и ##tttt
У первого время жизни равно (или меньше) времени жизни коннекта. Причём данная таблица "видна" только из данного процесса, из другого будет создан другой экземпляр.
Второй вид - более "глобальный", его время жизни - до перезагрузки сервера.
2. Все временные таблицы создаются в рамках tempdb
3. При создании временной таблицы внутри ХП она будет автоматически убита при выходе из ХП.
С другой стороны, тебе никто не мешает создать таблицу ручками, передать её в качестве параметра в хп, поработать с ней, сделать потом ещё какую-то выборку, и после этого ручками убить.


Кщд   (2009-01-20 13:35:00) [35]

"извне" - это откуда?
глобальные временные(##) не устраивают?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо