Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
Ситуация сложилась такая, очень прошу помощи: 1) Для построение отчетов, я использую SQL Server Reporting Services - это компонент Microsoft Visual Studio 2005. 2) В этой среде в качестве входных параметров, при формировании отчета, можно выбрать такой параметр как: multi-value. Этот параметр предоставляет возможность выбирать не один (sign) параметр, а несколько, из списка возможных. На экране это выглядит как выпадающий список с несколькими заданными заранее значениями (значения эти могут быть любого типа: string, integer и тд). Записывается он в переменную, какого типа я сама не понимаю, но содержит он данные (тип данных указывается при объявлении этого multi параметра), которые мы выбираем из выпадающего списка - через запятую. То есть если я выбираю из выпадающего списка значения типа integer: 1 2 3 4 5, то выглядеть они будут так: 1,2,3,4,5 (интересно какой тип эта переменная будет иметь?) 3) При выборе такого вот параметра при выполнении отчета, и использовании его в дальнейшем в SQL скрипте возникает одна большая проблемма, заключается она в следущем: этот параметр, невозможно использовать нигде, кроме как в конструкции ESLECT в разделе WHERE ..... IN(multi-value). А мне необходимо передавать этот multi параметр в процедуру!!! Распарсить этот параметр никак не удается, потому что любые функции работы со строковыми переменными нещадно ругаются на разделитель типа запятая, из за чего в функцию передается не один параметр в качестве просматриваемой строки, а целых 5 (исходя из вышеописанной ситуации в пункте 2). Преобразовать явно в тип varchar тоже нельзя. Единственный выход который я нашла, заключается в использовании динамического SQL и выполнении sp_executesql внутри процедуры. Но теперь, к сожалению по незнанию, не могу написать грамотно тело процедуры с использованием sp_executesql, хочу я получить следующее: создаю процедуру: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. в этой процедуре параметр @ParamAll - не играет особой роли, а вот @ParamCaseID и является этим загадочным параметром, который невозможно передать в эту процедуру из за того что он выбран множественно! Все что я смогла написать и удачно выполнить было следующее: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Может кто-то сталкивался с подобной ситуацие, ведь существует же такой параметр как multi-value а работать то как с ним, удобный но ни к чему не прикладываемый?? Помогите пожалйста :), ведь вопрос уже больше по SQL чем по репортинг сервису. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 13:55 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
А зачем в этом случае Вы создаете процедуру? Помоему multi-value параметр в этом запросе и без процедуры прекрасно отработает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 14:38 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
Дело в том, что у заказчика требование, все запросы к SQL Server должны выполняться только посредством хранимых процедур! К сожалению ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 15:52 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
BOLWriting Queries that Map to Multivalued Report Parameters You can define a multivalued parameter for any report parameter that you create. However, if you want to pass multiple parameter values back to a query, the following requirements must be satisfied: * The data source must be SQL Server, Oracle, or Analysis Services. * The data source cannot be a stored procedure. Reporting Services does not support passing a multivalued parameter array to a stored procedure. * The query must use an IN clause to specify the parameter ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 16:15 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
Спасибо огромное, дуреха не заметила этого в BOL! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 16:25 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
pr0ger BOL... * The data source cannot be a stored procedure. Reporting Services does not support passing a multivalued parameter array to a stored procedure. ... But you still can do it yourself if stored procedures the only way to go : Массивы и Списки в SQL Server ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 16:28 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
BugsBunny pr0ger BOL... * The data source cannot be a stored procedure. Reporting Services does not support passing a multivalued parameter array to a stored procedure. ... But you still can do it yourself if stored procedures the only way to go : Массивы и Списки в SQL Server Более проблематично третье условие The query must use an IN clause to specify the parameter ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 16:32 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
В смысле более проблематично? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 16:40 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
Где взять IN в параметрах хранимой процедуры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 16:42 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
2 pr0ger : What I meant was "If you start using sp - you are on your own and no more restriction like mentioned "The query must use an IN clause to specify the parameter" are applied". So, it was just a link to the knowledge "How to be on one's own with multivalued parameters". As per reporting services, it's exactly what they do: just replace "multivalued" parameter in the query with "union all" subquery - the same dynamic SQL byverka used. No doubt that it will be quite tricky to do the same with stored procedure (especially if it's encrypted) :) By the way, Oracle's row-level security did exactly the same (on engine level, of course) : replaced "row-level security"-enabled table with corresponding view in all stemenets. Side-effects: sounds great but good for small tables only. (disclaimer: my knowledge of Oracle is theoretical only) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 16:54 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
Вот что получилось: В процедуру передается строка с параметрами через запятую, процедура их обрабатывает как описано в вышепреведенной статье В отчете Dataset выглядит примерно так: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 17:26 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
pr0gerВот что получилось: В процедуру передается строка с параметрами через запятую, процедура их обрабатывает как описано в вышепреведенной статье "Reporting Service"-compatible wrapper - really neat idea of using RS "pre-processor" to handle multivalued parameters. Can it handle following approach (picked up from some third-party reporting tool)? 1. load multivalued parameters into "parameters" table 2. use "parameters" table inside stored procedure filtering output with "inner join" 3. clean up Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 18:14 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
pr0gerВот что получилось: В процедуру передается строка с параметрами через запятую, процедура их обрабатывает как описано в вышепреведенной статье В отчете Dataset выглядит примерно так: Код: plaintext 1. 2. В вышеприведенной статье, описана функция, в которую передается переменная типа ntext, а у меня вообще непонятно какого типа переменная, причем еще и не распарсеная. Проблемма у меня именно в этом, как передать этот параметр в функцию?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 18:22 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
byverkaВ вышеприведенной статье, описана функция, в которую передается переменная типа ntext, а у меня вообще непонятно какого типа переменная, причем еще и не распарсеная. Проблемма у меня именно в этом, как передать этот параметр в функцию?? ntext просто содержит значиния любого типа. А сама функция уже должна знать как правильно сделать convert. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 19:36 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
Игорь Оробчук byverkaВ вышеприведенной статье, описана функция, в которую передается переменная типа ntext, а у меня вообще непонятно какого типа переменная, причем еще и не распарсеная. Проблемма у меня именно в этом, как передать этот параметр в функцию?? ntext просто содержит значиния любого типа. А сама функция уже должна знать как правильно сделать convert. Не получается, делаю так: Создаю в своей базе функцию - duo_text_split_me(@list ntext, @delim nchar(1) = N',') - точно так же как описано в статье! в самом дата сете пишу следующее: select * from duo_text_split_me(@ParamCaseID,DEFAULT) - что бы просто посмотреть, схватит ли функция этот параметр. Делаю Preview отчета, выдается следующая ошибка: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 19:48 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
Эта функция используется для преобразования строки вида 'param1, param2, param3' в табличный вид, т.е. она должна использоваться уже в процедуре, а не в датасете. Для преобразования multivalue-параметра в строку можно использовать способ, который я описал ранее. Или сделать, как описал BugsBunny, с помощью вспомогательной таблицы с параметрами, это более производительный и более масштабируемый способ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 21:18 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
byverka...Делаю Preview отчета, выдается следующая ошибка: Код: plaintext Can you run profiler to see what statement(s) are sent to the server by tracing SQL:Batch Starting or/and SQL:Statement Starting events? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2006, 22:57 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
Ребят, всем спасибо огромное, но все равно без SELECT а здесь никак не обойтись, то есть что бы хоть как-то распарсить параметр multi. Потом получилась такая картина: 1) Создала процедуру: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Далее идем в мой дата сет, вот как он выглядит: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Ругаеться: Код: plaintext Причем ругается именно уже при выполнении тела процедуры LastSettlement_Case (я проверяла, саму переменную @res я выводила в этом дата сете без проблемм). Никак не могу понять почему, сама процедура, вне дата сета отлично работает, но правда только в том случае, если входной параментр указывается в следующем виде: Код: plaintext Да, хотела отметить важный момент - поле CaseID в таблице TL_Case - типа int! Из за этого у меня все проблеммы! Все остальное не проходит, в общем сложно, а в profiler не могу посмотреть какой параметр передается в процедуру, не могу найти в настройках profiler то событие, которое бы выводил бы значение передаваемого в процедуру параметра. Может быть подскажете как это событие в profiler называется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2006, 17:19 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
Did you try method suggested by pr0ger? I think it should work. It seems like Microsoft just wrap your select query into dynamic sql by replacing @multivalue with "1,2,3" (without quotes) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2006, 17:44 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
BugsBunnyDid you try method suggested by pr0ger? I think it should work. It seems like Microsoft just wrap your select query into dynamic sql by replacing @multivalue with "1,2,3" (without quotes) В каком именно вызове я должна использовать параметр @multivalue без кавычек?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2006, 18:00 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
Дело все лишь в том, что все запросы к серверу должны быть обернуты в хранимые процедуры, в моем случае это сделать никак не получается, по крайней мере последний вариант моей процедуры и дата сета - не работают, если честно я не знаю почему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2006, 18:03 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
Сам недавно столкнулся с такой проблемой. Решил по "рабоче-крестьянски". В запросе (DataSet) передаю в процедуру параметр типа varchar. Например, @MultiValueString. Сам параметр не декларируется в запросе. RS designer при этом создает параметр отчета MultiValueString. Делаем его скрытым (hiden) и присваиваем ему дефолтое значение через функцию Join(...), которая выпрямляет выбранные значения множественного параметра в одну строку c указанным разделителем. И все. Естественно, в процедуре используется динамический запрос (exec sp_executesql @cmd). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2006, 18:04 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
а без динамического SQL? что-то вроде: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2006, 18:08 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
pr0gerа без динамического SQL? что-то вроде: Сори, у меня еще и динамический источник данных (таблицы разные). Токо из-за этого ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2006, 18:11 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
to byverka: I didn't get it - did you tried this: create procedure for your working version of dynamic sql: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. in report Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2006, 18:22 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
/topic/266672&hl= ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2006, 18:26 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
tacitСам недавно столкнулся с такой проблемой. Решил по "рабоче-крестьянски". В запросе (DataSet) передаю в процедуру параметр типа varchar. Например, @MultiValueString. Сам параметр не декларируется в запросе. RS designer при этом создает параметр отчета MultiValueString. Делаем его скрытым (hiden) и присваиваем ему дефолтое значение через функцию Join(...), которая выпрямляет выбранные значения множественного параметра в одну строку c указанным разделителем. И все. Естественно, в процедуре используется динамический запрос (exec sp_executesql @cmd). Спасибо за еще одну интересную мысль :) Просто опять же, мне нельзя использовать в дата сете непосредственно SELECT, все обращения к серверу нужно обернуть в хранимые процедуры! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2006, 18:31 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
byverka tacitСам недавно столкнулся с такой проблемой. Решил по "рабоче-крестьянски". В запросе (DataSet) передаю в процедуру параметр типа varchar. Например, @MultiValueString. Сам параметр не декларируется в запросе. RS designer при этом создает параметр отчета MultiValueString. Делаем его скрытым (hiden) и присваиваем ему дефолтое значение через функцию Join(...), которая выпрямляет выбранные значения множественного параметра в одну строку c указанным разделителем. И все. Естественно, в процедуре используется динамический запрос (exec sp_executesql @cmd). Спасибо за еще одну интересную мысль :) Просто опять же, мне нельзя использовать в дата сете непосредственно SELECT, все обращения к серверу нужно обернуть в хранимые процедуры! Ну а конструкцию типа: insert into #t1 exec usp_Report @MultiValueString select * from #t1 тоже нельзя? Формально есть select, но ведь вся выборка данных в процедуре? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2006, 18:39 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
byverkaПросто опять же, мне нельзя использовать в дата сете непосредственно SELECT, все обращения к серверу нужно обернуть в хранимые процедуры! Странное требование. Безопасность? Вообще-то по правильному должна быть семантичекая модель данных, из которой стоятся отчеты. Модель может брать данные из вьюх. И из табличных функций (прямо или через вьюхи). Потому права можно обрезать начиная с вьюх с функциями и заканчивая сущностями модели - там все достаточно гибко. Это так, инфа к размышлению. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2006, 20:00 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
tacit byverka tacitСам недавно столкнулся с такой проблемой. Решил по "рабоче-крестьянски". В запросе (DataSet) передаю в процедуру параметр типа varchar. Например, @MultiValueString. Сам параметр не декларируется в запросе. RS designer при этом создает параметр отчета MultiValueString. Делаем его скрытым (hiden) и присваиваем ему дефолтое значение через функцию Join(...), которая выпрямляет выбранные значения множественного параметра в одну строку c указанным разделителем. И все. Естественно, в процедуре используется динамический запрос (exec sp_executesql @cmd). Спасибо за еще одну интересную мысль :) Просто опять же, мне нельзя использовать в дата сете непосредственно SELECT, все обращения к серверу нужно обернуть в хранимые процедуры! Ну а конструкцию типа: insert into #t1 exec usp_Report @MultiValueString select * from #t1 тоже нельзя? Формально есть select, но ведь вся выборка данных в процедуре? Попробую сделать так, но у меня сейчас одна проблемма - в теле процедуры у меня сравнивается поле типа int со строкой, которую мы получаем после распарсивания multi параметра. В ответ на запуск моей процедуры получаю ругань. Еще раз всем огромное спасибо за советы, почти все перепробовала, попробую еще разок может что сама наколдую! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2006, 17:41 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
Вот эта идея сработала безотказно: авторЕсть multivalue параметр отчета @parametr. Создается параметр отчета @parametr1 типа string, ему присваивается значение =join(Parameters!parametr.Value,", "), то есть значения параметра parametr разделенные через запятую. @parametr1 передается в процедуру, в который используется динамический SQL. Просто классно ))) всем спасибо за разные идеи! Многие из них помогли в других ситуациях! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2006, 12:37 |
|
||
|
Использование sp_executesql в SQL Server Reporting Services
|
|||
|---|---|---|---|
|
#18+
А меня другая проблема. Есть @Var1 и @Var2 - оба multi-value параметры ну и SQL запускает select Col1, Col2, Max(Col3) from table1 with (nolock) WHERE Col1 IN (@Var1) and Col2 IN (@Var1) Group By Col1, Col12 Всё бы хорошо, но когда я выбираю (Select All) для параметра/ов он всё равно выполняет IN statement, и получaется медленно, потому как каждое значение подставляется в IN ('value1', 'value2', 'value', ....), а бы хотелось чтобы запускал: select Col1, Col2, Max(Col3) from table1 with (nolock) Group By Col1, Col12 Вопрос тут, есть ли прособ программно определить, что (Select All) выбран чтобы выключать IN? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2008, 09:33 |
|
||
|
|

start [/forum/search_topic.php?author=Legnakrad&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 442ms |
| total: | 602ms |

| 0 / 0 |
