我创建了一个执行动态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
是正确调用函数还是函数不正确?
答案 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
另外,请检查您的数据类型以确保字段正确无误。看起来奇怪的是传入一个varchar的id,并为另一个字段返回一个int。无论哪种方式,这都可以帮助您朝着正确的方向前进。