Я создал пользовательскую функцию, которая возвращает инструкцию WHERE на основе некоторых значений в другой таблице.
WHERE dbo.tblGeneralLedgerEntry.accountID = 1210
Затем я использую хранимую процедуру для построения и выполнения инструкции SELECT:
SELECT dbo.tblGeneralLedgerEntry.*, dbo.tblJournalAccountHead.description As header
FROM dbo.tblGeneralLedgerEntry
INNER JOIN dbo.tblJournalAccountHead ON dbo.tblGeneralLedgerEntry.documentReference = dbo.tblJournalAccountHead.documentReference
WHERE dbo.tblGeneralLedgerEntry.accountID = 1210
Все работает успешно, но я получаю пустые результаты. Когда я просто выполняю оператор без использования функции, я получаю результаты, поэтому я знаю, что это не проблема.
Хранимая процедура (@reportID = 10000)
DECLARE @sql_select nvarchar(1000)
IF (@reportID = 10000) BEGIN
SET @sql_select =
'SELECT dbo.tblGeneralLedgerEntry.*, dbo.tblJournalAccountHead.description As header ' +
'FROM dbo.tblGeneralLedgerEntry ' +
'INNER JOIN dbo.tblJournalAccountHead ON dbo.tblGeneralLedgerEntry.documentReference = dbo.tblJournalAccountHead.documentReference '
END
DECLARE @sql nvarchar(4000) = @sql_select + dbo.reportWhere(@reportID)
EXEC ( @sql )
Использование MS-SQL с Access 2010 в ADP.
Что я делаю не так?
Спасибо!
EDIT
Причина, по которой он не работал, заключается в том, что он не должен:
Динамический SQL в пользовательских функциях
Это очень просто: вы не можете использовать динамический SQL из используемых функций, написанных на T-SQL. Это связано с тем, что вам не разрешено делать в UDF что-либо, что может изменить состояние базы данных (поскольку UDF может вызываться как часть запроса) Поскольку вы можете делать что-либо из динамического SQL, включая обновления, очевидно, что динамический SQL не разрешен.
Источник: Проклятие и благословения динамического SQL