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


если передать на вход простейшую процедуру с параметром, он ее без проблем выполняет и кидает в отчет этот параметр:
create procedure [dbo].[test_int]
   @date int
as
  select @date


чуть меняю процедуру:
create procedure [dbo].[test_dynamic]
   @date int
as
declare @sql varchar(800)
set @sql = 'select * from dbo.DW_GD_CZNR' + cast(@date as varchar(6))
--'201108'
  exec(@sql)


все!
теперь процедура не работает из-под BO.
но он не отдает ошибку сервера, отдает
Connection or SQL statement error.
Detailes: No column or data to fetch.

он как-то корежит параметр, но как -- кто бы знал.
порыла в интернете, как получить полный текст.
выполняю
select text
from sys.dm_exec_requests
cross apply sys.dm_exec_sql_text(2)
where session_id = 57


Msg 569, Level 16, State 4, Line 1
The handle that was passed to dm_exec_sql_text was invalid.


вот полная картинка из профайлера.
помогите идеями, плиз!

К сообщению приложен файл. Размер - 72Kb
11 дек 11, 20:50    [11745671]     Ответить | Цитировать Сообщить модератору
 Re: передача параметра в процедуру через sp_execute  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
beg_inner
все!
теперь процедура не работает из-под BO.
Это особенность вашего посто=роителя отчётов.

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

Спрашивайте в форуме по вашему "построителю отчётов BO".
11 дек 11, 21:18    [11745768]     Ответить | Цитировать Сообщить модератору
 Re: передача параметра в процедуру через sp_execute  [new]
beg_inner
Guest
alexeyvg,
так получается дело не в BO?
надо, чтоб передаваемое добро было заранее откомпилировано?
т.е. если имя таблицы заранее неизвестно, то бесполезно и пытаться?
или я неправильно поняла?
вообще почему нету хэлпа по этому sp_execute?
11 дек 11, 22:36    [11746039]     Ответить | Цитировать Сообщить модератору
 Re: передача параметра в процедуру через sp_execute  [new]
Glory
Member

Откуда:
Сообщений: 104751
beg_inner
так получается дело не в BO?
надо, чтоб передаваемое добро было заранее откомпилировано?

Именно в BO
Дело не в компиляции, а в желании BO заранее знать формат возвращаемого процедурой набора данных
И использует он для этого документированную команду SET FMTONLY
11 дек 11, 22:55    [11746099]     Ответить | Цитировать Сообщить модератору
 Re: передача параметра в процедуру через sp_execute  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
beg_inner
так получается дело не в BO?
Я наоборот сказал, что дело в вашем BO (кстати, даже не знаю, что это такое).

Это он сначала вызывает вашу процедуру с указанием SET FMTONLY ON, читает результат, потом вызывает вашу процедуру с указанием SET FMTONLY OFF, получает другой результат, и впадает в ступор (результаты разные - в первом случае рекордсета нет, т.к. внутренний exec не исполняется, во втором случае возвращается нормальный рекордсет).

beg_inner
вообще почему нету хэлпа по этому sp_execute?
Где пробовали искать? У меня в BOL есть хелп по sp_execute.

Только он ничего не даст. sp_execute просто выполняет запрос, хелп по ней очень простой.
beg_inner
т.е. если имя таблицы заранее неизвестно, то бесполезно и пытаться?
Нужно спросить на форуме по BO.

Он просто работает неправильно, с очень распространённой ошибкой (не понимаю, зачем многие так пишут и какие преимущества это даёт. Может, в этом есть какой-то тайный смысл?).
11 дек 11, 22:56    [11746102]     Ответить | Цитировать Сообщить модератору
 Re: передача параметра в процедуру через sp_execute  [new]
beg_inner
Guest
спасибище!
я ему подсунула еще 1 ниочемный селект,
чтоб знал, что результат непустой:
ALTER procedure [dbo].[test_dynamic]
   @date int
as
declare @sql varchar(800)
set @sql = 'select * from dbo.DW_GD_CZNR' + cast(@date as varchar(6))
--'201108'
  select getdate()
  exec(@sql)

теперь он процедуру отрабатывает -- отдает дату и отдает содержимое таблицы.
а почему он не впадает в ступор, что сперва 1 рекордсет должен вернуть, а потом на деле оказываются 2?
12 дек 11, 00:53    [11746388]     Ответить | Цитировать Сообщить модератору
 Re: передача параметра в процедуру через sp_execute  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
beg_inner
а почему он не впадает в ступор, что сперва 1 рекордсет должен вернуть, а потом на деле оказываются 2?
Видимо, так эта программа написана - использует последний рекордсет...

Ещё можно писать так:
if @date is null
  select getdate() -- тут лучьше рекордсет, похожий на реальный во время выполнения
else
  exec(@sql)
12 дек 11, 11:20    [11747610]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить