2011-08-15 30 views
0

すべてのプロシージャで特定の文字列を検索および置換するプロシージャを作成する方法はありますか?SQL Serverのプロシージャ間で文字列を置換する

+0

もう少し情報をお願いします。すべてのテーブルや特定のフィールドのすべてのフィールドを検索しようとしていますか? – Marc

+0

私はソフトウェア自体とintefering SQLストアドプロシージャのコメントを置き換えようとしていますが、手作業で1つ1つ手作業で行う方法が多すぎます –

+2

したがって、ストアドプロシージャ定義を一括更新しようとしています? –

答えて

2

多分アプリケーションを修正する方が簡単でしょう。なぜソフトウェアはコメントを心配していますか?拡張プロパティでもbarfですか?コメントは常に同じであると仮定すると、

、テキストに結果をManagement Studioでこれを実行します。

SET NOCOUNT ON; 

SELECT 'GO 
    ' + REPLACE([definition], '/* offending comment */', '') 
    FROM sys.sql_modules 
    WHERE [definition] LIKE '%/* offending comment */%'; 

これはGOで区切らCREATE PROCEDURE一連のコマンドを生成します。実際にCREATE PROCEDUREストリングがストアード・プロシージャー本体内にある場合は、必ずCREATE PROCEDUREの検索/作成を実行してALTERに変更することはできません。だからではなく、あなたの好きなテキストエディタにこれらの結果を引っ張って検索を行うとするために置き換えることができます。

GO 
CREATE PROCEDURE 

はでそれを置き換える:これはあなたがコメントを持っていないことを前提としていますが

GO 
ALTER PROCEDURE 

CREATE PROCEDUREの行の前に入力してください。

有効な文字列を含む手順を心配する必要がない場合は、CREATE PROCEDURE - あなたが気にしないのであればD

SET NOCOUNT ON; 

SELECT 'GO 
    ' + REPLACE(REPLACE([definition], '/* offending comment */', ''), 
    'CREATE PROCEDURE', 'ALTER PROCEDURE') 
    FROM sys.sql_modules 
    WHERE [definition] LIKE '%/* offending comment */%'; 

...あなたの構文は、実際にCREATE PROCEDUREないCREATE PROCまたはCREATEPROCの間に、あなたのシステムでは、大文字と小文字は区別されていないとあなたがcreate procCreate Procを使用しているランダムな間隔であると仮定するとストアドプロシージャに関連した既存の有形物、例えばパーミッションは、あなたも、このようにそれを行うことができます:それはちょうど手続きをドロップし、それを再作成するので

SELECT 'DROP PROCEDURE ' 
    + QUOTENAME(OBJECT_SCHEMA_NAME([object_id])) 
    + '.' + QUOTENAME(OBJECT_NAME([object_id])) + '; 
    ' + 'GO 
    ' + REPLACE([definition], '/* offending comment */', '') 
FROM sys.sql_modules 
WHERE [definition] LIKE '%/* offending comment */%'; 

これには、変更する必要はありません(、行く準備に非常に近いですスクリプトを生成します。 CREATEALTER)ですが、アクセス許可や依存関係のためにオブジェクトを削除して再作成することはあまり一般的ではありません。

CREATE OR REPLACEなどのDDLで類似していると、これをスクリプト化するのがはるかに簡単になります。あなたは、これがSQL Serverへの貴重な追加だろうと感じた場合は、以下の提案に投票(とあなたのユースケースを追加するか、またはあなたが考える理由これはコメントに、価値がある)してください:

http://connect.microsoft.com/SQLServer/feedback/details/127219/create-or-replace

+0

ありがとうur説明のためにたくさん!コメントの妨げについては、その中に/その中にある行があり、それに沿った膨大な手続きや行について話しているので、手動で行うことは永遠に必要です。 –

+0

ありがとうございました!非常に便利なスクリプトのAaron Bertrandに感謝します。私は、2つのテーブルで "update statistics"を実行する一連のストアドプロシージャを用意していました。それらを変更して、 "fullscan、columnsで統計を更新する"ように変更しなければなりませんでした。これは(私の2番目のもの)私がやりたいことを正確に行いました - ALTERスクリプトを生成します。 "sp_MSforEachDB"ループと統合してプレスト! – NateJ

+0

いいえ、sp_msforeachdbを使用しないでください。http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and-more-flexible-sp-msforeachdb.aspx –

0

方法すべてのストアドプロシージャのスクリプトを.sqlファイルとして生成し、生成されたファイルのコメントをCTRL + Hのヘルプに置き換えます。これは簡単なオプションではありませんか?

+0

しかし、5,000の手続きがあり、そのうちの150個だけがコメントを含んでいれば...コメントを含む手続きに限定しようとすると( 'WHERE'節が必要です)、' REPLACE () 'あなたは出力を取得する前に呼び出し? –

+0

私は間違いなくあなたの意見を見ます。しかし、ウィザードを使用してスクリプトを生成すると、スクリプトの書式設定はそのままの状態になります。私たちがこれを取得するために独自のクエリを実行すると、書式設定にトスがかかると思うので、著者が混乱するかどうか疑問に思っていました。すべてのコメントがSPの冒頭にある場合、それはうまくいくはずですが、そのSP内の特定のコードブロックのコメントを置き換えたい場合はどうすればよいでしょうか? – vmvadivel

+0

なぜフォーマットは "トスをする"でしょうか?グリッドに結果を使用しても、テキストの結果は正確である必要があります(手順のどれもが最大テキスト出力より長くない限り)。コメントのタイプとコメントが手続き本体にある場合はどちらも問題ではありませんが、問題の詳細が不足しているためにどちらかについてはわかりません。 –