сложный запрос T-sql в Tfrxadoqeury
Здравствуйте!
Нельзя ли в TfrxADOQuery выполнить сложный запрос для MS SQL Server, вроде такого:
Насколько я понимаю, движок FR парсит запрос и, естественно, выдает ошибку.
Хотелось бы, чтобы запрос просто напрямую шел к серверу, без парсинга.
Хранимые процедуры, VIEW и т.п. использовать нежелательно, хотелось бы всё держать внутри запроса.
Можно ли что-то вроде этого?
Нельзя ли в TfrxADOQuery выполнить сложный запрос для MS SQL Server, вроде такого:
IF EXISTS (SELECT OBJECT_NAME('#s'))
DROP PROCEDURE #s
GO
CREATE PROCEDURE #s AS
BEGIN
SELECT * FROM dbo.TABLE;
END
GO
EXEC #s
GO
Насколько я понимаю, движок FR парсит запрос и, естественно, выдает ошибку.
Хотелось бы, чтобы запрос просто напрямую шел к серверу, без парсинга.
Хранимые процедуры, VIEW и т.п. использовать нежелательно, хотелось бы всё держать внутри запроса.
Можно ли что-то вроде этого?
Комментарии
Дело в том, что упомянутый компонент является подчиненным для другого. Т.е. у него указан параметр Master.
И вот тут я не понял где именно вызывать ExecSQL.
Единственное что приходит в голову - в OnBeforePrint вызывать ExecSQL, а в OnAfterPrint - Close
Указанный метод не подходит при использовании master-detail, когда в master датасете текст SQL формируется "на лету".
Если есть Master-Detail и в ADOQuery_Detail идёт вызов exec dbo.моя_хранимка :param1
а в dbo.моя_хранимка делается динамическое формирование запроса с exec(@my_sql_str)
то такой способ не фунциклирует и отчёт не строится
ругается на символ '*' при парсинге - хотя * у меня в запросе нигде нет - ошибка фастрепорта
Прескорбно
Может кто подскажет выход из положения ?
я бы не создавал процедуры в детейле
меняйте идеологию
у меня лежит ADOQuery_master и ADOQuery_detail
на сервере процедура, которая вызывается этими 2-мя запросами
то есть в ADOQuery_master.SQL и в ADOQuery_detail.SQL происходит вызов exec dbo.моя_хранимка :par1, :par2
В детали в эту процедуру передаётся :ID_Master из результирующего рекордсета при выполнении ADOQuery_master
и все нормально работает с одним лишь условием - в теле моей dbo.моя_хранимка на серевере должен выполняться непосредственно Select
и он должен вызываться ЯВНО - а не собираться внутри dbo.моя_хранимка в строку и тамже вызываться в Exec чего собственно говоря и хотелось бы...
Но фастрепорт не принимает такой рекордсет и не заполняет параметр :ID_Master у ADOQuery_detail
Я ж написал, что и в FastReport работает мой вариант
НЕ работает только если в хранимке на сервере, которую я вызываю из TADOQuery в FastReport
пишу так:
DECLARE @sql varchar(8000)
SET @sql = 'SELECT pole1, pole2 FROM TABLE1'
exec(@sql)
Если я пишу в хранимке на сервере просто
SELECT pole1, pole2 FROM TABLE1
То отчёт нормально строится. В фасте выполняется сперва ADOQuery_master.SQL
потом выполняется ADOQuery_Detail.SQL в котором инициализируется автоматом параметр :masterID значением из master-рекордсета
Причём вышеприведённый запрос с exec замечательно отрабатывает в Enterprise Manager SQL Server
К запросу никаких нареканий
К инициализации переменных отчёта тоже претензий нет
Есть проблема именно если в вызываемой хранимке применяется exec(@sql) возвращающий набор данных, который должен уйти в фастрепорт для вывода отчёта
Но этого не происходит.
SELECT pole1, pole2 FROM TABLE1,
"в котором инициализируется автоматом параметр :masterID значением из master-рекордсета"
и что АДО, по-твоему, должен автоматом сделать с кодом
DECLARE @sql varchar(8000)
SET @sql = 'SELECT pole1, pole2 FROM TABLE1'
exec(@sql)
у меня для ADOQuery_Master в хранимке идёт вызов наподобии
SET @sql = 'SELECT ID_Master, pole1, pole2 FROM MASTER_TABLE WHERE...'
exec(@sql)
в ADOQuery отчёта вызывается моя хранимка с параметрами, а уже в этой хранимке вызывается exec, который возвращает рекордсет с выборкой
а насчёт задуматься над запросом - ты на что конкретно намекаешь ?
я просто для детали не писал полный текст запроса - суть проблемы от этого не изменится
для детали в этой же хранимке вызывается
SELECT pole1, pole2 FROM TABLE2 WHERE ID_Master = @ID_Master,
где @ID_Master - это передаваемый параметр, который должен браться по Master-связи из ADOQuery_master
и какие именно компоненты ты имеешь ввиду ?