0

この機能を削除する際に問題が発生しています。sp内でこの関数を宣言しています:

エラー: データベースには、'extract' という名前のオブジェクトが既に存在します。

IF OBJECT_ID('[rpt].[MissMatchesReport]') IS NOT NULL
BEGIN
DROP PROCEDURE [rpt].[MissMatchesReport]
END
GO
CREATE procedure [rpt].[MissMatchesReport]


as


IF object_id(N'extract', N'FN') IS NOT NULL
DROP FUNCTION extract
GO

create function [rpt].extract (@fileName varchar(1236))

returns varchar(123)
as
begin
declare @fileINS as integer = 1, @j int

while 1  = 1 
begin
SET @j = charindex('\', @fileName, @fileINS)
if @j < 1
break
SET @fileINS = @j + 1
end

return substring(@fileName, @fileINS, LEN(@filename) - @fileins+1)

end
GO

この関数を使用して、作成した一時テーブルに変更を加える唯一の理由です。spの最後に関数をドロップする必要がありますか?ただし、この SP はレポート用であるため、実行の最後に SP を削除しても、SSRS ですべてが機能し続けるかどうかはわかりません。

私はSSRSとSQLに非常に慣れていません。どんな助けでも大歓迎です!

ありがとう!

4

1 に答える 1

1

どこから始めれば。T-SQL は他のプログラミング言語とは異なります。ストアド プロシージャと関数の定義をネストすることはできません。これは制限ですが、すぐに慣れます。ドキュメントは、この点について非常に明確です (制限と制限を参照してください)。

SP内で関数を宣言していると思うかもしれませんが、そうではありません。実際、お持ちの SP は全体として次のとおりです。

CREATE procedure [rpt].[MissMatchesReport]
as
IF object_id(N'extract', N'FN') IS NOT NULL
DROP FUNCTION extract
GO

GOSP が定義されているバッチ単位を終了します。それが定義です。(SP に関数をドロップすることできます。) 関数の定義が SP の範囲外です。

練習問題として、SP の本体をbegin/endブロックに入れることをお勧めします。begin try/SP でエラーを処理したい場合は、発生した多くのエラーをトラップできるように、 end catch` ブロックに配置することをお勧めします (ただし、より高度な方法です) 。

関数とストアド プロシージャを入れ子にすることはできないという考えで、コードを書き直す必要があります。おそらく、関数を維持する必要があります。のような複雑な名前を付けるとよいでしょうufn_MissMatchesReport_extract

于 2013-05-29T00:19:35.947 に答える