web-dev-qa-db-ja.com

編集のためにすべてのストアドプロシージャ定義(コンテンツ)を表示する

これが以前に尋ねられた場合は申し訳ありませんが、提案された「関連する」質問は関連性がなく、私自身の検索はほとんど見つかりませんでした。

すべてのストアドプロシージャの定義(コード)を一覧表示する必要があります。これにより、450個すべてのストアドプロシージャを処理し、セミコロンを追加してv2014標準に向けて作業を開始できます。

私は次のコード here を見つけ、それをわずかに変更しました:

SELECT
    obj.Name AS SPName,
    REPLACE(modu.definition, 'CREATE PROC', 'ALTER PROC') + 'GO' AS SPDefinition
FROM
    sys.sql_modules modu INNER JOIN
    sys.objects obj ON modu.object_id = obj.object_id
WHERE
    (obj.type = 'P')
ORDER BY
    obj.name;

上記のコードは、SAアカウントを使用して実行されます。

私は仮定これが私が必要とするものを正確に提供したと思っていますが、MSDNの誰かが それが表示されないと主張していることに気づきました全文 期待どおり。

結果をSSMSエディターに貼り付けると、46,000行のコードを処理するため、不足しているものがあるかどうかはわかりません。エディターで1日を無駄にする前に、このプロセスを正しく開始したことを確認します。

したがって、これがこのアプローチの真の欠点であるのか、それとも1つずつではなく別の方法があるのか​​を尋ねるように、プロに連絡します。

7
EvilDr

MSDNで言及されている問題は、_sys.sql_modules_またはOBJECT_DEFINITION()とは関係ありません。彼らは問題を誤って解釈した。実際に起こったのは、それらがManagement Studioの出力制限によって妨げられたことです。これは、デフォルトでは255文字のみを表示し、結果からテキストへの出力タプルでは最大8192を表示します。

したがって、まず、これを8192に変更してください。

ツール>オプション>クエリ結果> SQL Server>テキストへの結果>
各列に表示される最大文字数

これで、4K未満のすべての手順に対して1つのスクリプトを作成できます。

_SELECT REPLACE(m.definition, N'CREATE PROC', N'ALTER PROC') 
  + CHAR(13) + CHAR(10) + N'GO'
FROM sys.sql_modules AS m
INNER JOIN sys.procedures AS p
ON m.[object_id] = p.[object_id]
WHERE LEN(m.definition) <= 4000
ORDER BY p.name;
_

(もちろん、置き換えは単純です-_create procedure_(複数のスペース)がある場合、または大文字と小文字を区別する照合を使用している場合はどうなりますか?それらのいくつかを手動で修正する必要がある場合があります。)

これで、大規模なプロシージャのスクリプトを手動で取得することだけを気にする必要があります。まず、何かあるかどうかを確認します。

_SELECT name 
  FROM sys.procedures 
  WHERE LEN(OBJECT_DEFINITION([object_id])) > 4000; 
_

ここでいくつかの回避策について少し説明します(動的SQLのコンテキストでは、変数にOBJECT_DEFINITION()を割り当てた場合も同じです)。

https://www.mssqltips.com/sqlservertip/3185/validate-the-contents-of-large-dynamic-sql-strings-in-sql-server/

Magoo氏は正解です 、Management Studio内のスクリプト機能を使用すると、完全な定義を取得できます。切り捨てについて心配する必要はありません。

  • プロシージャを右クリック、modifyまたは_script as > alter to >_
  • オブジェクトエクスプローラーの詳細で、上記と同じことを行いますが、複数の
  • データベースを右クリックして、_tasks > generate scripts >_を実行します(ただし、これはCREATEではなくALTERを実行するため、置換を実行する必要があります)

余談ですが、あらゆる場所にセミコロンを追加している間、すべてのプロシージャがスキーマのプレフィックス(procedurenameだけでなく_dbo.procedurename_など)を使用して作成され、すべてのオブジェクトに対しても作成されるようにすることをお勧めしますプロシージャ内の参照。それらは 問題を引き起こす可能性が高い よりずっと前に セミコロンの欠如はこれから です。また いくつかの一般的なこと 変更を行う際に留意してください。

7
Aaron Bertrand

SQL Server Management Studioのオブジェクトエクスプローラーを使用して、一度に1つの手順で上から移動します。

  1. 手順を右クリックします。
  2. 変更を選択します。
  3. プロシージャコードを編集します。
  4. リストアイテム
  5. F5を押して、手順の変更を実行します。
  6. タブを閉じます。
  7. 1に移動します。

手順リストの一番下から同じことを行うことで、あなたとあなたの友人の間で作業を簡単に分割できます。そして、休憩などに行く必要があるときに、コードの半分が完了した巨大な壁が残ることはありません。

また、自分が行う作業と他の誰かが同じ手順で行った作業との間で編集の競合が発生する可能性がある期間を最小限に抑えることができます。 4日間のコード編集の4日後、最終的に46,000行のコードを実行すると、編集中に他の誰かが行ったことを上書きする可能性があります。ソース管理を使用する場合(そして使用する必要がある場合)、変更をマージする必要があるのは「唯一」です。

2
Mikael Eriksson