2013-03-02 4 views
14

Я создаю функцию для выполнения динамического SQL и возвращаю значение. Я получаю «Только функции, а некоторые расширенные хранимые процедуры могут выполняться изнутри функции». как ошибка.Ошибка при выполнении динамического sql внутри функции (SQL Server)?

Функция:

Create Function fn_GetPrePopValue(@paramterValue nvarchar(100)) 
returns int as 
begin 
declare @value nvarchar(500); 

Set @SQLString = 'Select Grant_Nr From Grant_Master where grant_id=' + @paramterValue 

exec sp_executesql 
     @query = @SQLString,  
     @value = @value output 

return @value 
end 

Исполнение:

Select dbo.fn_GetPrePopValue('10002618') from Questions Where QuestionID=114 

и:

Select fn_GetPrePopValue('10002618') from Questions Where QuestionID=114 

ли функция вызывается правильно или функция неправильно?

ответ

7

Вы не можете использовать динамический SQL из функции, вы также не можете вызвать хранимые процедуры.

Create proc GetPrePopValue(@paramterValue nvarchar(100)) 
as 
begin 
declare @value nvarchar(500), 
     @SQLString nvarchar(4000) 

Set @SQLString = 'Select @value = Grant_Nr From Grant_Master where grant_id = @paramterValue' 

exec sp_executesql @SQLString, N'@paramterValue nvarchar(100)', 
     @paramterValue, 
     @value = @value output 

return @value 
end 
+0

Спасибо Александрии, очень благодарен !!!!!!! – Chaka

+0

BTW, для предотвращения использования SQL-инъекций sp_executesql с параметрами –

0

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

Create Function dbo.fn_GetPrePopValue(@paramterValue nvarchar(100)) 
returns int as 
begin 
    declare @value int 
    declare @SQLString varchar(MAX) 

    Select @value=Grant_Nr From Grant_Master where [email protected] 

    return @value 
end 

SQL Fiddle Demo

Также, пожалуйста, проверьте типы данных, чтобы убедиться, что вы поля являются правильными. Кажется странным передавать в varchar для id и возвращать int для другого поля. В любом случае, это должно помочь вам двигаться в правильном направлении.

1

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

Вам не нужен динамический запрос вообще в этом случае просто возвращает значение:

Create Function fn_GetPrePopValue(@paramterValue nvarchar(100)) 
returns int as 
begin 

return (select Grant_Nr From Grant_Master where grant_id = @paramterValue) 

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