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

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

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

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 に答える