Проблема с выполнением оператора, возвращенного из UDF - нет набора результатов - PullRequest
0 голосов
/ 19 декабря 2010

Я создал пользовательскую функцию, которая возвращает инструкцию 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

Ответы [ 2 ]

1 голос
/ 14 января 2011

Стефан;

Я думаю, что у тебя это задом наперед. UDF разрешены в динамическом SQL. Динамический SQL недопустим в UDF.

Например

ОБЪЯВИТЬ @sql_select nvarchar (1000)

ЕСЛИ (@reportID = 10000) НАЧАТЬ SELECT @sql_select = 'ВЫБРАТЬ dbo.tblGeneralLedgerEntry. *, Dbo.tblJournalAccountHead.description As header' + 'FROM dbo.tblGeneralLedgerEntry' + «ВНУТРЕННЕЕ СОЕДИНЕНИЕ END

EXEC (@sql)

-Aaron MCITP: DBA

0 голосов
/ 19 декабря 2010

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

CREATE FUNCTION dbo.fn_MyFunc(@AccountID int)
returns @Result Table(field1 f1type, ..., Header varchar(50))
as
BEGIN

Insert into @Result(field1 f1type, ..., Header varchar(50))
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 = @AccountID

Return

END

Использование как:

select * from dbo.fn_MyFunc(dbo.reportWhere(@reportID))

В этом случае UDF dbo.ReportWhere должен возвращать целочисленное скалярное значение

...