SQLServer-ストアドプロシージャをあるデータベースから別のデータベースにコピーします


86

私はSQLを初めて使用し、2つの.mdfデータベースを1つに結合する必要がありました。SQL Server 2008Managerを使用してこれを行いました-[タスク]> [テーブルのインポート/エクスポート]。テーブルとビューは正常にコピーされましたが、新しいデータベースにストアドプロシージャがありません。それを行う方法はありますか?


1
プログラムでコピーしたい場合は、ここから始めてください:stackoverflow.com/a/6124487/138938
Jon Crowell

回答:


137
  • データベースを右クリック
  • タスク
  • スクリプトを生成する
  • スクリプトを作成するオブジェクトを選択します
  • スクリプトからファイルへ
  • ターゲットデータベースに対して生成されたスクリプトを実行する

こんにちは、迅速な返信ありがとうございます。ターゲットデータベースに対してスクリプトを使用する方法を説明してください。これは初めてです。
オーク

1
@BarryKaye 30〜40のストアドプロシージャがある場合はどうなりますか?右クリックは少し遅いのではないでしょうか?
rvphx 2012年

@Oak SQL ManagementStudioで生成スクリプトファイルを開きます。接続を新しいデータベースに変更します。ファイルの最上部にある「UseDatabaseName」と書かれている行をデータベースに変更して実行します。
Jaimal Chohan 2012

ワオ。GUIベースのアプローチが好きなのは私だけだと思いました!!
rvphx 2012年

10
@ RajivVarma-データベースに対してこのタスクを1回実行します-各SPではありません!「ストアドプロシージャ」の横にあるトップレベルのチェックボックスをオンにすると、それらがすべて一緒に選択されます-1クリック。
バリー・ケイ

19

このコードは、マスターデータベース内のすべてのストアドプロシージャをターゲットデータベースにコピーします。プロシージャ名でクエリをフィルタリングすることにより、必要なプロシージャだけをコピーできます。

@sqlはnvarchar(max)として定義され、@ Nameはターゲットデータベースです

DECLARE c CURSOR FOR 
   SELECT Definition
   FROM [ResiDazeMaster].[sys].[procedures] p
   INNER JOIN [ResiDazeMaster].sys.sql_modules m ON p.object_id = m.object_id

OPEN c

FETCH NEXT FROM c INTO @sql

WHILE @@FETCH_STATUS = 0 
BEGIN
   SET @sql = REPLACE(@sql,'''','''''')
   SET @sql = 'USE [' + @Name + ']; EXEC(''' + @sql + ''')'

   EXEC(@sql)

   FETCH NEXT FROM c INTO @sql
END             

CLOSE c
DEALLOCATE c

ありがとう!...コメントではありますが、コードでは宣言されていません@sql@NameDECLARE @sql NVARCHAR(MAX); DECLARE @Name NVARCHAR(32);
datalifenyc19年

異なるサーバーでこれを同じようにする方法はありますか?サーバーAからサーバーBへ?
Rajaram1991

5

遅いものですが、役に立つかもしれない詳細を提供します…

これが長所と短所でできることのリストです

SSMSを使用してスクリプトを生成する

  • 長所:非常に使いやすく、デフォルトでサポートされています
  • 短所:スクリプトが正しい実行順序になっていない可能性があり、ストアドプロシージャがセカンダリデータベースにすでに存在する場合はエラーが発生する可能性があります。実行する前に、必ずスクリプトを確認してください。

サードパーティのツール

  • 長所:ApexSQL Diffなどのツール(これは私が使用しているものですが、RedGateDevArtのツールのような他の多くのツールがあります)は、ワンクリックで2つのデータベースを比較し、すぐに実行できるスクリプトを生成します
  • 短所:これらは無料ではありません(ただし、ほとんどのベンダーは完全に機能するトライアルを持っています)

システムビュー

  • 長所:セカンダリサーバーに存在するストアドプロシージャを簡単に確認し、存在しないストアドプロシージャのみを生成できます。
  • 短所:もう少しSQLの知識が必要です

別のデータベースには存在しない、あるデータベースのすべてのプロシージャのリストを取得する方法は次のとおりです。

select *
from DB1.sys.procedures P
where P.name not in 
 (select name from DB2.sys.procedures P2)

5

私は当初、この投稿で、ストアドプロシージャをリモートの本番データベースからローカルの開発データベースにコピーするための解決策を探していました。このスレッドで提案されたアプローチを使用して成功した後、私はますます怠惰になり(またはあなたが好む方はどちらでも機知に富んで)、これを自動化したいと思った。私はこのリンクに出くわしましたが、これは非常に役立つことがわかり(vincpaに感謝)、それを拡張して次のファイル(schema_backup.ps1)を作成しました。

$server             = "servername"
$database           = "databaseName"
$output_path        = "D:\prod_schema_backup"
$login = "username"
$password = "password"

$schema             = "dbo"
$table_path         = "$output_path\table\"
$storedProcs_path   = "$output_path\stp\"
$views_path         = "$output_path\view\"
$udfs_path          = "$output_path\udf\"
$textCatalog_path   = "$output_path\fulltextcat\"
$udtts_path         = "$output_path\udtt\"

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo")  | out-null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | out-null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended")  | out-null
$srvConn = new-object Microsoft.SqlServer.Management.Common.ServerConnection
$srvConn.ServerInstance = $server
$srvConn.LoginSecure = $false
$srvConn.Login = $login
$srvConn.Password = $password
$srv        = New-Object Microsoft.SqlServer.Management.SMO.Server($srvConn)
$db         = New-Object ("Microsoft.SqlServer.Management.SMO.Database")
$tbl        = New-Object ("Microsoft.SqlServer.Management.SMO.Table")
$scripter   = New-Object Microsoft.SqlServer.Management.SMO.Scripter($srvConn)

# Get the database and table objects
$db = $srv.Databases[$database]

$tbl            = $db.tables | Where-object { $_.schema -eq $schema  -and -not $_.IsSystemObject } 
$storedProcs    = $db.StoredProcedures | Where-object { $_.schema -eq $schema -and -not $_.IsSystemObject } 
$views          = $db.Views | Where-object { $_.schema -eq $schema } 
$udfs           = $db.UserDefinedFunctions | Where-object { $_.schema -eq $schema -and -not $_.IsSystemObject } 
$catlog         = $db.FullTextCatalogs
$udtts          = $db.UserDefinedTableTypes | Where-object { $_.schema -eq $schema } 

# Set scripter options to ensure only data is scripted
$scripter.Options.ScriptSchema  = $true;
$scripter.Options.ScriptData    = $false;

#Exclude GOs after every line
$scripter.Options.NoCommandTerminator   = $false;
$scripter.Options.ToFileOnly            = $true
$scripter.Options.AllowSystemObjects    = $false
$scripter.Options.Permissions           = $true
$scripter.Options.DriAllConstraints     = $true
$scripter.Options.SchemaQualify         = $true
$scripter.Options.AnsiFile              = $true

$scripter.Options.SchemaQualifyForeignKeysReferences = $true

$scripter.Options.Indexes               = $true
$scripter.Options.DriIndexes            = $true
$scripter.Options.DriClustered          = $true
$scripter.Options.DriNonClustered       = $true
$scripter.Options.NonClusteredIndexes   = $true
$scripter.Options.ClusteredIndexes      = $true
$scripter.Options.FullTextIndexes       = $true

$scripter.Options.EnforceScriptingOptions   = $true

function CopyObjectsToFiles($objects, $outDir) {
    #clear out before 
    Remove-Item $outDir* -Force -Recurse
    if (-not (Test-Path $outDir)) {
        [System.IO.Directory]::CreateDirectory($outDir)
    }   

    foreach ($o in $objects) { 

        if ($o -ne $null) {

            $schemaPrefix = ""

            if ($o.Schema -ne $null -and $o.Schema -ne "") {
                $schemaPrefix = $o.Schema + "."
            }

            #removed the next line so I can use the filename to drop the stored proc 
            #on the destination and recreate it
            #$scripter.Options.FileName = $outDir + $schemaPrefix + $o.Name + ".sql"
            $scripter.Options.FileName = $outDir + $schemaPrefix + $o.Name
            Write-Host "Writing " $scripter.Options.FileName
            $scripter.EnumScript($o)
        }
    }
}

# Output the scripts
CopyObjectsToFiles $tbl $table_path
CopyObjectsToFiles $storedProcs $storedProcs_path
CopyObjectsToFiles $views $views_path
CopyObjectsToFiles $catlog $textCatalog_path
CopyObjectsToFiles $udtts $udtts_path
CopyObjectsToFiles $udfs $udfs_path

Write-Host "Finished at" (Get-Date)
$srv.ConnectionContext.Disconnect()

これを呼び出す.batファイルがあり、タスクスケジューラから呼び出されます。Powershellファイルを呼び出した後、次のようになりました。

for /f %f in ('dir /b d:\prod_schema_backup\stp\') do sqlcmd /S localhost /d dest_db /Q "DROP PROCEDURE %f"

その行はディレクトリを通過し、再作成するプロシージャを削除します。これが開発環境でない場合は、プログラムでこの方法でプロシージャを削除したくありません。次に、すべてのストアドプロシージャファイルの名前を.sqlに変更します。

powershell Dir d:\prod_schema_backup\stp\ | Rename-Item -NewName { $_.name + ".sql" }

そして、実行します:

for /f %f in ('dir /b d:\prod_schema_backup\stp\') do sqlcmd /S localhost /d dest_db /E /i "%f".sql

そして、それはすべての.sqlファイルを反復処理し、ストアドプロシージャを再作成します。これのどの部分も誰かに役立つことが証明されることを願っています。


私はこれが好きです。プロダクションDBからチャンクを1年ごとにアーカイブするプロセスを作成する必要があります。スキーマの開発時におそらく更新されないSQLファイルをぶら下げておく必要はないので、ファイルをディスクに書き込む中間ステップなしで、ターゲットに基づいて空のDBを作成するようにこれを適応させています(詳細そうじする)。私はこれがおそらくこの質問に対する最良で最も再利用可能な答えだと思います、称賛に値します!
スティーブペティファー2014

3

SSMSの「GenerateScripts ...」機能を使用して、転送する必要のあるものをすべてスクリプト化できます。SSMSでソースデータベースを右クリックし、[スクリプトの生成...]を選択して、ウィザードに従います。次に、ストアドプロシージャのcreateステートメントを含む結果のスクリプトを実行します。


3

使用する

select * from sys.procedures

すべての手順を表示します。

sp_helptext @objname = 'Procedure_name'

コードを取得するには

そして、それらすべてをループしてエクスポートコードを生成する何かを構築するあなたの創造性:)


3

他の回答に示されているように、ストアドプロシージャのスクリプトを生成できます。スクリプトが生成されたら、次のsqlcmdようにターゲットDBに対してスクリプトを実行するために使用できます。

sqlcmd -S <server name> -U <user name> -d <DB name> -i <script file> -o <output log file> 

0

Mgmt Studioで、元のデータベースを右クリックし、[タスク]、[スクリプトの生成]の順にクリックします...-ウィザードに従います。


0

SELECT定義+ char(13)+ 'GO' FROM MyDatabase.sys.sql_modules s INNER JOIN MyDatabase.sys.procedures p ON [s]。[object_id] = [p]。[object_id] WHERE p.name LIKE'Something% '"queryout" c:\ SP_scripts.sql -S MyInstance -T -t -w

spを取得して実行します


これは非常に優れたソリューションですが、1)テキストまたはファイルの出力が必要であることを指摘する必要があります(グリッドに結果を表示しないでください。EOL文字が失われます)。2)8kの制限があるようです。 SQL Server ManagementStudioでのテキスト出力用。
DAB

0

もう1つのオプションは、SQL Server Integration Services(SSIS)を使用してストアドプロシージャを転送することです。SQLServerオブジェクトの転送タスクと呼ばれるタスクがあります。このタスクを使用して、次のアイテムを転送できます。

  • テーブル
  • ビュー
  • ストアドプロシージャ
  • ユーザー定義関数
  • デフォルト
  • ユーザー定義のデータ型
  • 分配関数
  • パーティションスキーム
  • スキーマ
  • アセンブリ
  • ユーザー定義の集計
  • ユーザー定義タイプ
  • XMLスキーマコレクション

これは、SQLServerオブジェクトの転送タスクのグラフィカルチュートリアルです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.