Трюки о том, как выполнить строку внутри функции в Sql Server

Процедура FunctionX, строка 345

Недопустимое использование побочного оператора EXECUTE STRING внутри функции.

Я получаю указанную выше ошибку при выполнении динамического оператора внутри функции в SQL Server 2012. Есть ли обходной путь для этого? Какие-нибудь трюки?

PS: sproc (хранимая процедура) слишком длинная, чтобы ее тело можно было вставить как есть внутри функции.

DECLARE @execsql NVARCHAR(2000)
Set @execsql = 'INSERT INTO @TABLE1 EXEC SPROC1 ' + @ID_COMPANY + ',' + @ID_COUNTRY 
exec (@execsql)

Спасибо заранее.

Кроме того, мне нужно иметь возможность удалять и внутри функции. Я знаю, что это противоречит определению функций, но мне интересно, есть ли какие-то приемы, которые можно использовать


person JD123456    schedule 30.09.2015    source источник
comment
Более важный вопрос заключается в том, почему вы думаете, что вам нужно использовать функцию здесь? Функция предназначена для возврата одного значения, это не хранимая процедура, которую вы описываете.   -  person Sean Lange    schedule 30.09.2015


Ответы (1)


Нет никаких хитростей, см. Проклятие и благословения динамического SQL

Динамический SQL в пользовательских функциях

Это очень просто: вы не можете использовать динамический SQL из используемых функций, написанных на T-SQL. Это связано с тем, что вам не разрешено делать в пользовательской функции что-либо, что могло бы изменить состояние базы данных (поскольку пользовательская функция может быть вызвана как часть запроса). Поскольку вы можете делать что угодно из динамического SQL, включая обновления, очевидно, почему динамический SQL не разрешен.

Я видел не один пост в группах новостей, где люди бились об это головой. Но если вы хотите использовать динамический SQL в пользовательской функции, отмените проект и переделайте его. Вы натолкнулись на препятствие, и в SQL 2000 нет выхода.

В SQL 2005 и более поздних версиях вы можете реализовать свою функцию как функцию CLR. Напомним, что весь доступ к данным из среды CLR — это динамический SQL. (Вы защищены, так что, если вы выполните операцию обновления из своей функции, вас поймают.) Тем не менее, слово предупреждения: доступ к данным из скалярных UDF часто может привести к проблемам с производительностью. Если вы скажете

SELECT ... FROM tbl WHERE dbo.MyUdf(somecol) = @value

а MyUdf осуществляет доступ к данным, вы более-менее создали скрытый курсор.

person Lukasz Szozda    schedule 30.09.2015