18

実際、これは 2 つの部分からなる質問です。

  1. 標準の検索/置換関数のように、何らかの機能を使用してすべてのストアド プロシージャから文字列を検索し、場合によってはそれを置換することは可能ですか?

  2. すべてのストアド プロシージャ コードにこのような完全なデータベース パスが含まれていて[db1].[dbo].[table1]、データベース名を に変更した場合[db2]、SQL Server がすべてのコードを[db1]テーブルからに自動的に更新する方法はあります[db2]か? それとも手動で行う必要がありますか?

4

13 に答える 13

55

SSMS の [オブジェクト エクスプローラーの詳細] ウィンドウから、ストアド プロシージャ フォルダーを開きます。すべてのオブジェクトを選択し (このウィンドウから複数選択できます。オブジェクト エクスプローラーの [詳細] ウィンドウのほとんどの目的はこれだけです)、右クリックして、DROP および CREATE としてスクリプトを作成することを選択します。これで検索/置換を実行できるようになり、実行する前に必要なすべてを一度に置換できます。

編集:このソリューションについてブログを書きました。

于 2012-04-22T19:56:20.647 に答える
22

遅いものですが、うまくいけば便利です。

データベース内のオブジェクトを検索して名前を変更できるApexSQLの無料の検索ツールがあります。

彼らは、テーブル、関数、ストアド プロシージャなどのオブジェクトのすべての出現を検索/置換するスマートな名前変更オプションがあると言います。

名前の変更機能を使用していないことを付け加える必要がありますが、検索が非常にうまく機能していることを確認できます.

また、私は ApexSQL とは提携していませんが、ApexSQL のツールを使用しています。

于 2013-09-26T14:32:59.197 に答える
14

検索するには:データベースオブジェクト(テーブル、列、トリガーなど)を名前で検索する必要がある場合は、SQL検索と呼ばれる無料のRed-Gateツールを参照してください。これにより、データベース全体で任意の種類の文字列が検索されます。 )。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

これは、DBAやデータベース開発者にとって必須のツールです。あらゆる種類の用途に完全に無料で使用できることはすでに述べましたか?

このツールはテキストの置換をサポートしていませんが、関連するすべてのストアドプロシージャ(または他のDBオブジェクト)を見つけることができるだけでも非常に役立ちます。

于 2012-04-22T16:05:24.277 に答える
6
  1. すべての SP をファイルにエクスポートします。お気に入りのテキスト編集ツールを使用して検索/置換します。スクリプトを実行してデータベースを更新します (プロシージャの名前を変更しない限り)。

  2. 完全なデータベース パスを明示的に定義する場合は、手動で (上記を参照) ストアド プロシージャを更新する必要があります。データベース名を含めない場合、またはリンク サーバーなどを使用する場合、変更は必要ありません。

于 2012-04-22T15:29:22.403 に答える
4

ALTER PROCEDUREストアド プロシージャは、最初にそれらをステートメントとしてスクリプト化しないと、その場で更新できません(または ..これについては後で詳しく説明しDROP/CREATEますALTER PROCEDURE)。幸いなことに、SSMS を使用して、すべての手順を 1 つのファイルにスクリプト化できます。DDL ステートメントは最初は になりますが、他の変更とともにCREATE PROCEDUREに置き換えます。ALTER PROCEDURE

または、プロシージャを としてスクリプト化することもできますがDROP/CREATE、依存関係エラーが発生する傾向があるため、多数のスクリプトに対してこれを行うのは好きではありません。

質問のパート 2 については、スクリプトを使用してデータベース パスの変更を手動で編集する必要があります。

于 2012-04-22T15:36:36.737 に答える
3

テキストの検索と置換を定義し、それを実行するだけで、すべての手順で一度にテキストを置換できるこのスクリプトを見つけました。これが大量に役立つことを願っています。

-- set "Result to Text" mode by pressing Ctrl+T
SET NOCOUNT ON

DECLARE @sqlToRun VARCHAR(1000), @searchFor VARCHAR(100), @replaceWith VARCHAR(100)

-- text to search for
SET @searchFor = '[MY-SERVER]'
-- text to replace with
SET @replaceWith = '[MY-SERVER2]'

-- this will hold stored procedures text
DECLARE @temp TABLE (spText VARCHAR(MAX))

DECLARE curHelp CURSOR FAST_FORWARD
FOR
-- get text of all stored procedures that contain search string
-- I am using custom escape character here since i need to espape [ and ] in search string
SELECT DISTINCT 'sp_helptext '''+OBJECT_SCHEMA_NAME(id)+'.'+OBJECT_NAME(id)+''' ' 
FROM syscomments WHERE TEXT LIKE '%' + REPLACE(REPLACE(@searchFor,']','\]'),'[','\[') + '%' ESCAPE '\'
ORDER BY 'sp_helptext '''+OBJECT_SCHEMA_NAME(id)+'.'+OBJECT_NAME(id)+''' '

OPEN curHelp

FETCH next FROM curHelp INTO @sqlToRun

WHILE @@FETCH_STATUS = 0
BEGIN
   --insert stored procedure text into a temporary table
   INSERT INTO @temp
   EXEC (@sqlToRun)

   -- add GO after each stored procedure
   INSERT INTO @temp
   VALUES ('GO')

   FETCH next FROM curHelp INTO @sqlToRun
END

CLOSE curHelp
DEALLOCATE curHelp

-- find and replace search string in stored procedures 
-- also replace CREATE PROCEDURE with ALTER PROCEDURE
UPDATE @temp
SET spText = REPLACE(REPLACE(spText,'CREATE PROCEDURE', 'ALTER PROCEDURE'),@searchFor,@replaceWith)

SELECT spText FROM @temp
-- now copy and paste result into new window
-- then make sure everything looks good and run
GO

参照リンクは次のとおりです

于 2015-03-23T19:47:39.597 に答える
3

これを使用して、ストアド プロシージャ定義のテキストを検索できます。

SELECT 
  Name 
FROM 
  sys.procedures 
WHERE 
   OBJECT_DEFINITION(OBJECT_ID) LIKE '%YourSearchText%'

ストアド プロシージャにあるテキストのコンテキストがわからないため、通常、置換はお勧めできません。Powershellスクリプトを介して可能ですが、おそらく可能です。

私はクエリを快適に書くことができるので、他のソリューションよりもこのソリューションを好みます。そのため、スキーマ (x) とデータベース (y) にあり、(z) で始まる名前のすべてのストアド プロシージャでテキストを検索することは、非常に簡単で直感的です。クエリ。

于 2012-04-23T15:14:02.770 に答える
0

組み込み機能でこれを行う方法はありません。今日は役に立たないかもしれませんが、そこにいる間はすべての参照を同義語に変更することをお勧めします。そうすれば、将来これが再び発生した場合 (そして再び発生する場合)、すべての外部参照が 1 つの場所にあり、簡単に更新できます。ちなみに、後者についてはブログ投稿があります。

于 2012-04-23T00:20:27.907 に答える