在函数(SQL Server)中执行动态sql时出错?

时间:2013-03-02 23:17:13

标签: sql sql-server-2008 function

我创建了一个执行动态SQL并返回值的函数。我得到“只有函数和一些扩展存储过程可以在函数内执行。”作为一个错误。

功能:

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

是正确调用函数还是函数不正确?

3 个答案:

答案 0 :(得分:8)

您无法使用函数中的动态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 

答案 1 :(得分:2)

功能受限于它们可以使用的内容,因此您可以在查询中使用它们,而不会意外地制作会产生可怕性能的内容。使用动态查询是其中之一,因为这会导致每次执行的查询计划,并且还会使该函数无法成为查询计划的一部分。

在这种情况下,根本不需要动态查询,只需返回值:

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

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

end 

答案 2 :(得分: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 grant_id=@paramterValue

  return @value
end 

SQL Fiddle Demo

另外,请检查您的数据类型以确保字段正确无误。看起来奇怪的是传入一个varchar的id,并为另一个字段返回一个int。无论哪种方式,这都可以帮助您朝着正确的方向前进。