sp_rename で名前が変更されたストアド プロシージャがいくつかあるようです。これにより、新しい proc 名ではなく古い proc 名が syscomments に残されます。
したがって、私のデータベース転送は正しく転送されません。
名前が同期していない proc (または任意のオブジェクト) を見つける方法はありますか?
または、それらを見つけて修正する簡単な方法はありますか?
sp_rename で名前が変更されたストアド プロシージャがいくつかあるようです。これにより、新しい proc 名ではなく古い proc 名が syscomments に残されます。
したがって、私のデータベース転送は正しく転送されません。
名前が同期していない proc (または任意のオブジェクト) を見つける方法はありますか?
または、それらを見つけて修正する簡単な方法はありますか?
あなたは試すことができます
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_rename
2 つのオブジェクトの定義を交換するために使用された可能性がある場合は使用しないでください。sp_refreshsqlmodule
どうやらその状況でバグがあります!