1

頻繁に更新し、別のサーバー上の複製データベースに転送する大量のストアド プロシージャがあります。SQL Server Management Studio 2008 内から各「storedproc.sql」ファイルを開き、既存のストアド プロシージャを作成または変更するツールバーの [実行] を選択しました。私はストアドプロシージャごとにこれを行ってきました。

データベース上のすべてのストアド プロシージャを、フォルダ内にあるストアド プロシージャで一度に変更できるスクリプト (または別の方法) を探しています。基本的に、以下のテキストのような擬似コードに似たスクリプトを探しています。

USE [DatabaseName]
UPDATE [StoredProcName]
   USING [directory\file\path\fileName.sql]
UPDATE [StoredProcNameN]
   USING [directory\file\path\fileNameN.sql
…

最もきれいな疑似コードではありませんが、アイデアを理解していただければ幸いです。すべてのストアド プロシージャを (名前に基づいて) 削除し、データベースに同じストアド プロシージャを再度作成することもできます。もっと明確にする必要がある場合は、遠慮なくコメントしてください。事前に感謝します。

さらに説明するには:

SSRS 変換プロジェクトのすべてのレポート ストアド プロシージャを変更しています。レポートが作成されたら、レポートとストアド プロシージャをサーバーに移動します。次に、複製されたデータベースに対して各ストアド プロシージャを手動で実行 (ALTER または CREATE) する必要があるため、データベースはサーバー上のレポートをサポートできるようになります。これまでのところ、これはそれほど問題ではありませんでしたが、最終的には 65 から 85 のストアド プロシージャが必要になります。また、それぞれに 1 つのデータセット フィールドを追加する必要がある場合は、それぞれを手動で実行して複製データベースを更新する必要があります。

私ができるようにしたいのは、次のような SQL スクリプトを用意することです。このデータベースの場合、この名前付きストアド プロシージャを ALTER/CREATE すると、このフォルダー内の詳細を含む .sql テキスト ファイルを見つけることができます。

4

3 に答える 3

2

参考のため

c:\>for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f"
于 2012-06-05T03:12:06.127 に答える
2

すべてのストアド プロシージャをあるデータベースから別のデータベースに移動するために使用するコードを次に示します。

DECLARE @SPBody nvarchar(max);
DECLARE @SPName nvarchar(4000);
DECLARE @SPCursor CURSOR;
SET @SPCursor = CURSOR FOR
    SELECT ao.name, sm.definition
    FROM <SOURCE DATABASE>.sys.all_objects ao JOIN
         <SOURCE DATABASE>.sys.sql_modules sm
         ON sm.object_id = ao.object_id
    WHERE ao.type = 'P' and SCHEMA_NAME(ao.schema_id) = 'dbo'
    order by 1;

OPEN @SPCursor;

FETCH NEXT FROM @SPCursor INTO @SPName, @SPBody;
WHILE @@FETCH_STATUS = 0
BEGIN
    if exists(select * from <DESTINATION DATABASE>.INFORMATION_SCHEMA.Routines r where r.ROUTINE_NAME = @SPName)
    BEGIN
        SET @query = N'DROP PROCEDURE '+@SPName;
        exec <DESTINATION DATABASE>..sp_executesql @query;
    END;
    BEGIN TRY
        exec <DESTINATION DATABASE>..sp_executesql @SPBody;
    END TRY
    BEGIN CATCH
        select @ErrMsg = 'Error creating '+@SPName+': "'+Error_Message()+'" ('+@SPBody+')';
        --exec sp__LogInfo @ProcName, @ErrMsg, @ProductionRunId;
    END CATCH;
    FETCH NEXT FROM @SPCursor INTO @SPName, @SPBody;
END;

必要に応じて と を入れる必要があります。

于 2012-06-04T20:55:56.843 に答える
1

if exists(...) drop procedure最初にセクションが続くすべてのストアドプロシージャスクリプトファイルを保存することをお勧めしますcreate procedure。必要に応じて、オプションgoで最後にステートメントを含めます。

次に、ツールを使用して、すべてのファイルを1つのスクリプトファイルに連結できます。

このためにカスタムツールを使用して、依存関係の順序を定義したり、バッチセパレータ、スクリプトタイプを指定したり、フォルダを含めたりすることができます。UltraEditなどの一部のテキストエディタにはこの機能があります。

Microsoftデータベースプロジェクトを使用してスクリプトファイルのバッチを選択し、プロジェクトに保存されている1つ以上のデータベース接続に対してそれらを実行することもできます。これは、追加のソフトウェアを必要としない良い出発点ですが、プロジェクト内のフォルダーとファイルの追加と管理に関して少し苦痛になる可能性があります。

RedGateのSQLCompareなどのスキーマ比較ツールを使用すると、2つのデータベースのスキーマやオブジェクトを同期するのに役立ちます。ただし、これをベストプラクティスの展開または「本番環境への昇格」ツールとして使用することはお勧めしません。

于 2012-06-05T16:13:26.170 に答える