2

sp_rename で名前が変更されたストアド プロシージャがいくつかあるようです。これにより、新しい proc 名ではなく古い proc 名が syscomments に残されます。

したがって、私のデータベース転送は正しく転送されません。

名前が同期していない proc (または任意のオブジェクト) を見つける方法はありますか?

または、それらを見つけて修正する簡単な方法はありますか?

4

1 に答える 1

3

あなたは試すことができます

select object_name(id)
from syscomments 
WHERE COLID=1 AND
OBJECTPROPERTY(id, 'isprocedure')=1 and
REPLACE(REPLACE(TEXT,CHAR(13),' '),CHAR(10),' ') 
          NOT LIKE '%CREATE%PROC%'+ object_name(id) + ' %'
AND
(REPLACE(REPLACE(TEXT,CHAR(13),' '),CHAR(10),' ')
          NOT LIKE '%CREATE%PROC%'+ object_name(id) + ']%')

SYS.SQL_MODULESビットの前に約 4,000 文字のコメントがあるリスクがある場合は、おそらくもう少し堅牢になりCREATE PROCます。

ただし、テキストを自分で解析するよりも確実な解決策は、実行するスクリプトを生成して、すべてのストアド プロシージャを再コンパイルすることです。以下を実行すると...

SELECT 'EXEC sp_refreshsqlmodule ''' + 
            quotename(schema_name(schema_id)) + '.' + 
            quotename(object_name(object_id)) + '''' 
FROM sys.procedures

...次に、結果をコピーして管理スタジオのクエリ ウィンドウに貼り付け、結果のスクリプトを実行すると、名前が同期していない場合にエラーが発生します。

これにより、すべてのストアド プロシージャ プランが再コンパイルされるため、これが問題になる場合は運用サーバーでこれを行わないでください。

バグに関する追加情報を提供するために編集されました。

上記の回答のコードは、sp_rename2 つのオブジェクトの定義を交換するために使用された可能性がある場合は使用しないでください。sp_refreshsqlmodule どうやらその状況でバグがあります!

于 2010-07-28T22:03:02.927 に答える