2009-04-22 2 views
0

Я прохожу Просмотр имени как параметра в Таблице Значения, и я хочу получить некоторые данные из этого представления, построив динамический 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, 
     @[email protected] OUTPUT; 

ответ

1

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

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

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

0

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

что-то вроде этого, изменить в соответствии с вашими потребностями

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

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

+0

Не означает, что вы можете использовать вас. (Не помню даже, чтобы это делать. Должно быть, это был промах.) Теперь он заперт. Извини за это. – RMD

Смежные вопросы