web-dev-qa-db-ja.com

関数内で動的SQLを実行するとエラーが発生します(SQL Server)?

動的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

関数が適切に呼び出されていますか、または関数が正しくありませんか?

19
Chaka

関数から動的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 
8

関数は使用できるものが限られているため、誤ってパフォーマンスを低下させるようなことをせずにクエリで使用できます。動的クエリを使用することは、それらの1つです。これは、実行ごとにクエリを計画し、関数がクエリプランの一部になれないようにするためです。

この場合、動的クエリはまったく必要ありません。値を返すだけです:

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

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

end 
2
Guffa

関数から動的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

また、データ型をチェックして、フィールドが正しいことを確認してください。 idにvarcharを渡し、他のフィールドにintを返すのは奇妙に思えます。いずれにしても、これは正しい方向に進むのに役立つはずです。

0
sgeddes