動的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
関数が適切に呼び出されていますか、または関数が正しくありませんか?
関数から動的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つです。これは、実行ごとにクエリを計画し、関数がクエリプランの一部になれないようにするためです。
この場合、動的クエリはまったく必要ありません。値を返すだけです:
Create Function fn_GetPrePopValue(@paramterValue nvarchar(100))
returns int as
begin
return (select Grant_Nr From Grant_Master where grant_id = @paramterValue)
end
関数から動的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
また、データ型をチェックして、フィールドが正しいことを確認してください。 idにvarcharを渡し、他のフィールドにintを返すのは奇妙に思えます。いずれにしても、これは正しい方向に進むのに役立つはずです。