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

Откуда:
Сообщений: 37
Доброго всем времени суток.
Стоит 2012 сиквел.
Столкнулся с довольно занимательной траблой:
Есть некий селект из таблицы, поля и их имена не меняются, однако данный запрос должен выбирать данные по динамически составляемому условию:

SELECT бла бла бла
FROM TBL1 + @INNER + @JOIN + @WHERE + @SORT + @PARSER);


хде:
@INNER - inner join
@JOIN - outer join
@WHERE - where
@SORT - order by
@PARSER - пэйджинг. появился в 2012 МССКЛ-е

параметры могут быть, а могут приходить и пустые...

Решается естественно через INSERT INTO EXEC, но что делать, если таких селектов несколько, а у сиквела стоит долбанное ограничение на INSERT INTO EXEC равное одному. т.е. нельзя выполнять более одного INSERT INTO EXEC в одном вызове...

вкуривал от тут https://www.sql.ru/blogs/t-sql/1151.
однако эти способы не позволяют вводить динамические условия селекта...
линкед сервер работает нормально без RPC но тогда не выполняются процедуры, или RPC работает но тогда сервер не отвечает на запросы...

Есть ли способ избавиться от такой конструкции и еще каким-то способом динамически составить условие селекта?
10 сен 12, 15:56    [13141074]     Ответить | Цитировать Сообщить модератору
 Re: SELECT с динамическими параметрами  [new]
user89
Member

Откуда:
Сообщений: 2083
Crayzer,

???
https://www.sql.ru/faq/faq_topic.aspx?fid=104
https://www.sql.ru/faq/faq_topic.aspx?fid=114
10 сен 12, 16:13    [13141186]     Ответить | Цитировать Сообщить модератору
 Re: SELECT с динамическими параметрами  [new]
Crayzer
Member

Откуда:
Сообщений: 37
Ну так а я о чем... я в курсе такой конструкции. вопрос в ограничении на использование - только одна в одном вызове. Если будет вызвана параллельно другая процедура с такой же конструкцией, то сиквел пошлет далеко и на долго....

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

Больше конечно порадовал ответ от мелкософта на мсдн-е:

Thankyou for this question. As the comment points out, the dynamic SQL is what causes the problem. Whilst parsing the code, SQL-Server would need to parse the embedded SQL.
So I'll close this as "by-design". But look to the future where our parsing analysis might dig deeper than it currently does.


мда... воистину... сиквел - это копец...
10 сен 12, 16:32    [13141331]     Ответить | Цитировать Сообщить модератору
 Re: SELECT с динамическими параметрами  [new]
Glory
Member

Откуда:
Сообщений: 104760
Crayzer
Ну так а я о чем... я в курсе такой конструкции. вопрос в ограничении на использование - только одна в одном вызове. Если будет вызвана параллельно другая процедура с такой же конструкцией, то сиквел пошлет далеко и на долго....

Что за фантазии ?
10 сен 12, 16:40    [13141393]     Ответить | Цитировать Сообщить модератору
 Re: SELECT с динамическими параметрами  [new]
qwerty112
Guest
Crayzer
Решается естественно через INSERT INTO EXEC,
...

почему "естественно" ?

"решай" через глобальную времен.таблицу

зы
это, конечно, если без динамики "нууу, никак !", что спорно ...
10 сен 12, 16:41    [13141402]     Ответить | Цитировать Сообщить модератору
 Re: SELECT с динамическими параметрами  [new]
Crayzer
Member

Откуда:
Сообщений: 37
Glory, это не фантазии... сами попробуйте... ну или
https://connect.microsoft.com/SQLServer/feedback/details/272133/cannot-have-nested-insert-exec


qwerty112, в данном случае совсем ну никак, ибо в зависимости от выбранных параметров в софте, динамически меняется запрос. Написать 1000 селектов со всеми возможными сочетаниями параметров - явно не вариант )))

А можно поподробнее про способ с глобальной временной таблицей?
10 сен 12, 17:31    [13141824]     Ответить | Цитировать Сообщить модератору
 Re: SELECT с динамическими параметрами  [new]
Glory
Member

Откуда:
Сообщений: 104760
Crayzer
Glory, это не фантазии... сами попробуйте... ну или
https://connect.microsoft.com/SQLServer/feedback/details/272133/cannot-have-nested-insert-exec

А причем тут " Если будет вызвана параллельно другая процедура с такой же конструкцией, то сиквел пошлет далеко и на долго.." ?

nested-insert-exec - это вложенные вызовы в одном коннекте
И зачем вообще вам insert-exec так и не понятно

Сообщение было отредактировано: 10 сен 12, 17:38
10 сен 12, 17:37    [13141865]     Ответить | Цитировать Сообщить модератору
 Re: SELECT с динамическими параметрами  [new]
пришелец ванюша
Guest
очередной сеанс связи с галактикой "а давай я как будто знал как работает sql и типа понимал что хочу с помощью него сделать и еще вопросы умело формулировал"

+ правильный фон
мы медузы мы медузыыыы
мы похожи на арбузыыыы...
10 сен 12, 17:48    [13141928]     Ответить | Цитировать Сообщить модератору
 Re: SELECT с динамическими параметрами  [new]
Crayzer
Member

Откуда:
Сообщений: 37
Glory, объясняю еще раз.
INSERT INTO EXEC нужен для выполнения динамически составляемого селекта в темповую таблицу с последующей обработкой полученных данных + селект отрабатывает по разному в зависимости от того какой пользователь (админ/юзверь) этот селект запускает. ну не буду же я 100тысяч процедур или функций писать на все случаи жизни...
Отсюда желание написать универсальный динамический селект, который в зависимости от ряда параметров будет работать по разному... Вот тут и напарываюсь на nested-insert-exec...
10 сен 12, 18:31    [13142145]     Ответить | Цитировать Сообщить модератору
 Re: SELECT с динамическими параметрами  [new]
qwerty112
Guest
Crayzer
Glory, объясняю еще раз.
INSERT INTO EXEC нужен для выполнения динамически составляемого селекта в темповую таблицу с последующей обработкой полученных данных + селект отрабатывает по разному в зависимости от того какой пользователь (админ/юзверь) этот селект запускает. ну не буду же я 100тысяч процедур или функций писать на все случаи жизни...
Отсюда желание написать универсальный динамический селект, который в зависимости от ряда параметров будет работать по разному... Вот тут и напарываюсь на nested-insert-exec...


ТС,

приготовтесь, щас будет НОВОСТЬ !

через EXEC , можно выполнять НЕ только селект !
и не обязательно это делать через
INSERT INTO #Temp EXEC ('SELECT бла бла бла ...')


@SQL = 
'insert into ##Temp (бла бла бла)
select бла бла бла from бла бла бла
where ' + @WHERE1
exec (@SQL)  

@SQL = 
'insert into ##Temp (бла бла бла)
select бла бла бла from бла бла бла
where ' + @WHERE146
exec (@SQL) 
10 сен 12, 19:17    [13142325]     Ответить | Цитировать Сообщить модератору
 Re: SELECT с динамическими параметрами  [new]
первая причина - это ты
Guest
Crayzer
Glory, объясняю еще раз.
INSERT INTO EXEC нужен для выполнения динамически составляемого селекта в темповую таблицу с последующей обработкой полученных данных + селект отрабатывает по разному в зависимости от того какой пользователь (админ/юзверь) этот селект запускает. ну не буду же я 100тысяч процедур или функций писать на все случаи жизни...
Отсюда желание написать универсальный динамический селект, который в зависимости от ряда параметров будет работать по разному... Вот тут и напарываюсь на nested-insert-exec...


для выполнения

динамического
(и любого другого)

СЕЛЕКТА

никакой INSERT EXEC не нужен.

в какой момент возникла связь между желанием выполнять динамический селект и ограничением на nested-insert-exec?
чтобы она возникла, нужно написать кучу кода в котором будут сплошные insert-exec. может есть вариант не писать везде insert-exec? может можно вообще всю задачу решить без единого insert-exec?

может решение базируется на каких-то ошибочных идеях, если оно упирается в ограничения субд?
10 сен 12, 20:49    [13142580]     Ответить | Цитировать Сообщить модератору
 Re: SELECT с динамическими параметрами  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
Crayzer
Glory, это не фантазии... сами попробуйте... ну или
https://connect.microsoft.com/SQLServer/feedback/details/272133/cannot-have-nested-insert-exec
Сами попробуйте:
create table #tmp(id int)
insert #tmp(id)
exec ('select id from sysobjects')
exec ('select id from sysobjects')
exec ('select id from sysobjects')
10 сен 12, 21:07    [13142647]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить