19

我创建了一个函数来执行动态 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

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

4

3 回答 3

9

您不能从函数中使用动态 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 
于 2013-03-02T23:28:16.770 回答
2

函数的使用受到限制,因此您可以在查询中使用它们,而不会意外做出会导致糟糕性能的事情。使用动态查询就是其中之一,因为这会导致每次执行的查询计划,并且还会使函数无法成为查询计划的一部分。

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

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

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

end 
于 2013-03-02T23:35:58.830 回答
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 小提琴演示

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

于 2013-03-02T23:31:09.207 回答