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

Откуда:
Сообщений: 25
Есть две ХР. В первой на генерится "на лету" SQL запрос.
-----------------------------------------------
ALTER PROCEDURE X1 (@a int)
AS
create table #x1Results (lev varchar(255))

insert into #x1Results
exec ('Select top 100 lev from price')

select lev from #x1Results
-----------------------------------------------

Во второй пытаюсь воспользоваться результатами выполнения первой:

-----------------------------------------------
ALTER PROCEDURE Y2 (@a int)
AS
create table #y2Results (lev varchar(255))

insert into #y2Results
exec X1 1

select lev from #y2Results
-----------------------------------------------

при попытке запустить вторую процедуру получаю сообщение:
An INSERT EXEC statement cannot be nested.

При этом в первой процедуре нельзя изменить принцип генерации SQL "на лету".
Где же здесь ошибка?
15 фев 05, 22:11    [1323413]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные ХП, генерация SQL "на лету"  [new]
Glory
Member

Откуда:
Сообщений: 104760
Где же здесь ошибка?
An INSERT EXEC statement cannot be nested. Не могут и все.
15 фев 05, 22:29    [1323426]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные ХП, генерация SQL "на лету"  [new]
zzzxxx
Member

Откуда:
Сообщений: 25
хм... но первая ХП сама по себе отрабатывает правильно
при запуске второй сообщение таково:

Server: Msg 8164, Level 16, State 1, Procedure X1, Line 4
An INSERT EXEC statement cannot be nested.


те будучи вызванной из внешней ХП внутренняя ХП не может вставить значения. :(
16 фев 05, 07:35    [1323625]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные ХП, генерация SQL "на лету"  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
2 zzzxxx

Вам же уже сказали - бай дизайн! И всё тут...
Нельзя во вложенных процедурах польховать INSERT... EXEC. Придется перепроектировать... вплоть до схемы данных и идеологии приложения.
16 фев 05, 07:50    [1323634]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные ХП, генерация SQL "на лету"  [new]
Дамир1
Guest
Попробуйте такой вариант:
-----------------------------------------------
ALTER PROCEDURE X1 (@a int)
AS
exec ('Select top 100 lev from price')

-----------------------------------------------

Во второй пытаюсь воспользоваться результатами выполнения первой:

-----------------------------------------------
ALTER PROCEDURE Y2 (@a int)
AS
create table #y2Results (lev varchar(255))

insert into #y2Results
exec X1 1

select lev from #y2Results
-----------------------------------------------
16 фев 05, 07:57    [1323655]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные ХП, генерация SQL "на лету"  [new]
askir
Member

Откуда: Хабаровск
Сообщений: 43
Попробуй вместо первой процедуры использовать функция, которая возвращает recordset, а во второй сделай
insert into #y2Results 
select * from func1
16 фев 05, 08:23    [1323691]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные ХП, генерация SQL "на лету"  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
askir
Попробуй вместо первой процедуры использовать функция, которая возвращает recordset, а во второй сделай

если есть возможность - то Дамир1 предложил рабочее решение
16 фев 05, 08:30    [1323698]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные ХП, генерация SQL "на лету"  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Скорее всего, у него там вместо exec ('Select top 100 lev from price') ещё куча манипуляций с динамикой, да + манипуляция с залитыми данными во временную таблицу.
16 фев 05, 08:44    [1323713]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные ХП, генерация SQL "на лету"  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
ну тогда всегда можно вместо insert into ... exec(@sql)
можно сделать exec('insert into ... '+@sql)
примерно так
use tempdb
go
create proc p1
as
create table #t1(i int)
exec('insert into #t1 select 1')
select * from #t1
go
create proc p2
as
create table #t2(i int)
insert into #t2
exec p1
go
exec p2
go
drop proc p1
drop proc p2
16 фев 05, 08:51    [1323723]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные ХП, генерация SQL "на лету"  [new]
zzzxxx
Member

Откуда:
Сообщений: 25
2 TPG
действительно там куча манипуляций с динамикой
Решается такая задача:

идет выборка из таблицы в несколько проходов:

на первом проходе WHERE = @argument
на втором проходе WHERE Like '%'+@argument+'%'
на третьем проходе WHERE Contains (...@argument)
и тд...

всё это сливается во временную таблицу, сами операторы отбора хранятся как текст в таблице T_WHERE при этом предварительно решается какие именно строки из из T_WHERE будут использоваться, нпример только 1ая и 3я.

Если после выборки не набралось достаточного количества результатов (меньше 100), то немного видоизменяется аргумент (например входящие в него '-' заменяются на ' ' ) и снова:
первый проход, второй, третьий

опять не набрали результатов (меньше 100) еще раз меняем аргумент поиска и по новой:
первый проход, второй, третьий
16 фев 05, 09:10    [1323746]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные ХП, генерация SQL "на лету"  [new]
zzzxxx
Member

Откуда:
Сообщений: 25
2 TPG
действительно там куча манипуляций с динамикой
Решается такая задача:

идет выборка из таблицы в несколько проходов:

на первом проходе WHERE = @argument
на втором проходе WHERE Like '%'+@argument+'%'
на третьем проходе WHERE Contains (...@argument)
и тд...

всё это сливается во временную таблицу, сами операторы отбора хранятся как текст в таблице T_WHERE при этом предварительно решается какие именно строки из из T_WHERE будут использоваться, нпример только 1ая и 3я.

Если после выборки не набралось достаточного количества результатов (меньше 100), то немного видоизменяется аргумент (например входящие в него '-' заменяются на ' ' ) и снова:
первый проход, второй, третьий

опять не набрали результатов (меньше 100) еще раз меняем аргумент поиска и по новой:
первый проход, второй, третьий
16 фев 05, 09:20    [1323767]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить