Имя динамического представления в табличной функции - PullRequest
0 голосов
/ 22 апреля 2009

Я передаю View name как параметр в Table Valued Function, и я хочу извлечь некоторые данные из этого представления, построив динамический SQL и выполнив его sp_executesql () при попытке выполнить функцию я получаю сообщение об ошибке: Из функции могут выполняться только функции и расширенные хранимые процедуры.

СУБД: SQL Server 2005

какие-нибудь обходные пути?

set @SQLString = 
       N'select @Desc = Description from ' 
     + @TableName 
     + ' where Code = @Code;'

execute sp_executesql @SQLString, 
     N'@Code nvarchar(500), 
       @Desc nvarchar(500) OUTPUT', 
       @Code = @Code, 
       @Desc=@Desc OUTPUT;

Ответы [ 2 ]

1 голос
/ 22 апреля 2009

Ну, вы могли бы обернуть динамический SQL в расширенную хранимую процедуру. Это бы сработало, но я бы (настоятельно) не советовал этого делать.

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

Существуют и другие подходы, которые вы можете использовать, такие как предварительное заполнение табличной переменной вашими данными, изменение схемы и т. Д., Которые будут зависеть от ваших требований к производительности и от того, как вы настроили схему.

0 голосов
/ 22 апреля 2009

нет, если вы не хотите выполнить петлевой запрос, вызвав расширенный процесс, такой как xp_cmdshell

как-то так, измените в соответствии с вашими потребностями

CREATE FUNCTION fnBla(@id int)
RETURNS int
AS
BEGIN
DECLARE @SQL varchar(500)
SELECT @SQL='osql -S' +@@servername +' -E -q "exec tempdb..prLog ''fnBla''"'
EXEC master..xp_cmdshell @SQL
RETURN @id
END

Просто чтобы вы знали, что я бы так не поступил, так как вы создаете запрос с обратной связью и не выполняете самый безопасный код По какой причине вы не можете использовать процедуру вместо функции?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...