2010-12-06 7 views
3

既存のテーブルのコピーで新しいデータベースを作成しましたが、これらのテーブルの名前を変更しました。(多分SysObjectsを使用して)すべてのストアドプロシージャのこれらのテーブルへの参照?すべてのストアドプロシージャ内のすべてのテーブル参照を変更するSQLスクリプト

ありがとうございました。

+0

私は 'sysobjects'の言及からSQL Serverを想定していますか?もしそうなら、どのバージョン? –

+0

はいいいえSQL Server 2005 – Grace

+1

ストアドプロシージャのスクリプトを生成し、変更したすべてのテーブル名を検索して置き換えます。 – pavanred

答えて

4

はINFORMATION_SCHEMA.ROUTINESに依存しないでください。あなたがコンテンツを一覧表示するm.definitionのコメントを解除することができます

SELECT DISTINCT 
    LEFT(s.name+'.'+o.name, 100) AS Object_Name,o.type_desc --, m.definition 
    FROM sys.sql_modules  m 
     INNER JOIN sys.objects o ON m.object_id=o.object_id 
     INNER JOIN sys.schemas s ON o.schema_id=s.schema_id 
    WHERE m.definition Like '%'[email protected]+'%' 
    ORDER BY 1 

SELECT 
    OBJECT_SCHEMA_NAME(m.object_id)+'.'+OBJECT_NAME(m.object_id) --, m.definition 
    FROM sys.sql_modules m 
    WHERE m.definition like '%whatever%' 

SELECT 
    OBJECT_SCHEMA_NAME(m.object_id)+'.'+OBJECT_NAME(m.object_id), o.type_desc 
     --,m.definition 
    FROM sys.sql_modules  m 
     INNER JOIN sys.objects o ON m.object_id=o.object_id 
    WHERE m.definition like '%whatever%' 

が、私はそれを見つける:あなたはdefinitionは、データ型はnvarchar(max)の

変更する必要がある手順を見つけるために、これらのいずれかを試しているsys.sql_modulesに必要システム・テーブルでUPDATEコマンドを実行したくないため、すべてのプロシージャを識別して手動で確認する方がよいでしょう。必要な手順をスクリプト化し、変更(検索/置換または手動)してから、スクリプトを実行してください。

3

私はRedgateのSQL Refactorにこの機能があると思います。それ以外の場合は、すべてのオブジェクトをスクリプトアウトし、手動またはコード経由で検索して置換することができます。

SQL Server 2005では、何らかのヘルプの可能性がある同義語もサポートされています。

+0

はい、SQLリファクタリングには名前変更されたオブジェクトのすべての参照が変更されるスマートリネーム機能があります。SQLプロンプト5はすぐにリリースされる予定です。 –

3

ここには、特定の検索基準に一致するストアドプロシージャの定義を取得するために使用できるSQLのチャンクがあります。マーチンが提案したように検索と置換を行うために単にそれを変更することができます。

'%TABLE_NAME%'を変更する検索条件またはテーブル名に変更するだけです。

これが役に立ちます。

SELECT ROUTINE_NAME, ROUTINE_DEFINITION 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%TABLE_NAME%' AND ROUTINE_TYPE='PROCEDURE' 
+1

それは面白いです! +1 –

+1

** 'ROUTINE_DEFINITION'は' nvarchar(4000) 'なので、INFORMATION_SCHEMA.ROUTINES **には依存しないでください。 'sys.sql_modules'を使う必要があります。' definition'は 'nvarchar(max)'です。サンプルクエリの私の答えを見てください。 –

1

それは(テスト用データベースのような)短期なら、簡単に解決策は、古い名前を使用して、あなたは変わっ各テーブルにVIEWを作成することであってもよいです。たとえば、あなたがtests_newにテーブルtestsを変更した場合、あなたが行うことができます:

CREATE VIEW dbo.tests 
AS 
SELECT * FROM dbo.tests_new 

あなたのすべての手順は、その参照dbo.testsは、実際にdbo.tests_new内のデータを見ていきます。

非常に非常に悪い考えであるこれはパーマネント/プロダクションDBであれば、あなたの構造に難読化レイヤーを追加するだけで、それを維持するのは悪夢になります。

1

sprocsのテーブル参照をシステムデータ辞書から変更することはできません。ストアドプロシージャを作成するスクリプトを取得し、スクリプト内のテーブル名を変更する必要があります。あなたがスクリプトを持っているなら、これは単純な検索であり、ほとんどの部分を置き換えます。

スクリプトをお持ちでない場合は、ストアドプロシージャスクリプトのテキストをsys.sql_modulesから取得するか、SSMSを使用して取得できます。 ROUTINE_DEFINITIONだけnvarchar(4000)あるので

関連する問題