Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting an error when executing a dynamic sql within a function (SQL Server)?

I create a function to execute dynamic SQL and return a value. I am getting "Only functions and some extended stored procedures can be executed from within a function." as an error.

The function:

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 

The execution:

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

and:

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

Is the function being called properly or is the function incorrect?

like image 817
Chaka Avatar asked Mar 02 '13 23:03

Chaka


2 Answers

You cannot use dynamic SQL from a function, neither can you call stored procedures.

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 
like image 188
Aleksandr Fedorenko Avatar answered Nov 15 '22 07:11

Aleksandr Fedorenko


Functions are limited in what they can use, so that you can use them in a query without accidentally make something that would give horrible performance. Using dynamic queries is one of those things, as that would cause a query planning for each execution, and also would keep the function from being able to be part of a query plan.

You don't need the dynamic query at all in this case, just return the value:

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

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

end 
like image 2
Guffa Avatar answered Nov 15 '22 06:11

Guffa