2012-05-22 6 views
66

Ich bin neu in SQL, und was ich tun musste, war 2 MDF-Datenbanken zu einem zu kombinieren. Ich habe das mit SQL Server 2008 Manager - Aufgaben> Import/Export-Tabellen. Die Tabellen und Ansichten wurden erfolgreich kopiert, aber es gibt keine gespeicherten Prozeduren in der neuen Datenbank. Gibt es eine Möglichkeit, das zu tun?SQL Server - Kopieren von gespeicherten Prozeduren von einer Datenbank in eine andere

+1

Wenn Sie sie programmgesteuert kopieren möchten, starten Sie hier: http://StackOverflow.com/a/6124487/138938 –

Antwort

110
  • Rechtsklick auf Datenbank
  • Aufgaben
  • generieren Skripte
  • die Objekte auswählen, die Sie Skript wünschen
  • Script to File
  • Skripts ausführen, die gegen Zieldatenbank
+2

Aber das wird nicht gut für eine ganze Reihe von Geschäftsprozeduren sein. – rvphx

+4

@RajivVarma - warum nicht? –

+0

Hallo, vielen Dank für die schnelle Antwort. Können Sie bitte erläutern, wie Sie das Skript für die Zieldatenbank verwenden? Ich bin neu dazu. – Oak

3

Sie können die SSMS-Funktion "Generate Scripts ..." verwenden, um Scripts zu erstellen zu transferieren. Klicken Sie mit der rechten Maustaste auf die Quelldatenbank in SSMS, wählen Sie "Skripte generieren ..." und folgen Sie dem Assistenten. Führen Sie dann das resultierende Skript aus, das jetzt die create-Anweisungen für gespeicherte Prozeduren enthält.

0

Klicken Sie in Mgmt Studio mit der rechten Maustaste auf Ihre ursprüngliche Datenbank, dann auf Aufgaben und dann auf Skripts generieren ... - folgen Sie dem Assistenten.

3

Verwendung

select * from sys.procedures 

alle Prozeduren zu zeigen;

sp_helptext @objname = 'Procedure_name' 

den Code

und Ihre Kreativität, um etwas zu Schleife durch sie alle und erzeugen den Export Code :)

3

Sie scriptof die gespeicherte Prozedur des erzeugen kann zu bauen, wie in anderen Antworten dargestellt. Wenn das Skript generiert wurden, können Sie sqlcmd verwenden sie gegen Ziel-DB auszuführen wie

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

An einem späten aber mehr Details gibt, die nützlich sein könnten ...

Hier ist eine Liste der Dinge, die Sie mit tun Vor- und Nachteile

Skripte SSMS

    mit Gene
  • Pros: extrem einfach zu bedienen und standardmäßig unterstützt
  • Nachteile: Skripts möglicherweise nicht in der richtigen Reihenfolge ausgeführt und Sie möglicherweise Fehler erhalten, wenn gespeicherte Prozedur bereits in sekundären Datenbank vorhanden ist. Stellen Sie sicher, dass Sie das Skript vor der Ausführung überprüfen.

Third-Party-Tools

  • Vorteile: Tools wie ApexSQL Diff (das ist, was ich benutze, aber es gibt viele andere wie Werkzeuge von Red Gate oder Dev Art) vergleicht zwei Datenbanken in Ein Klick und generieren Skript, das Sie sofort ausführen können
  • Nachteile: diese sind nicht frei (die meisten Anbieter haben eine voll funktionsfähige Studie obwohl)

Aussichten

  • Vorteile: Sie einfach die gespeicherten Prozeduren existieren auf sekundären Server sehen können und nur erzeugen diejenigen, die Sie nicht haben.
  • Nachteile: erfordert ein wenig mehr SQL-Kenntnisse

Hier ist, wie eine Liste aller Verfahren in irgendeiner Datenbank zu erhalten, die in einer anderen Datenbank

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

SELECT Definition nicht existieren + char (13) + 'GO' VON MyDatabase.sys.sql_modules s INNERER JOIN MyDatabase.sys.procedures p ON [s]. [objekt_id] = [p]. [objekt_id] WHERE p.name LIKE 'Something%' "queryout "c: \ SP_scripts.sql -S MyInstance -T -t-

Holen Sie sich das SP und führen Sie es aus

9

Dieser Code kopiert alle gespeicherten Prozeduren in der Master-Datenbank in die Zieldatenbank, Sie können nur die Prozeduren kopieren, indem Sie die Abfrage nach Prozedurnamen filtern.

@sql als nvarchar (max) definiert ist, ist @Name die Zieldatenbank

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 
4

ich diesen Beitrag ursprünglich für eine Lösung Kopieren von gespeicherten Prozeduren von meiner entfernten Produktionsdatenbank zu meiner lokalen Entwicklung Datenbank Suche gefunden . Nach dem Erfolg des vorgeschlagenen Ansatzes in diesem Thread wurde mir klar, dass ich zunehmend faul (oder findig, was immer Sie bevorzugen) und wollte, dass dies automatisiert wird. Ich kam in this link, was sehr hilfreich erwiesen (danke vincpa), und ich verlängerte darauf, was in der folgenden Datei (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() 

ich eine .bat-Datei, die diese Anrufe und wird vom Taskplaner aufgerufen. Nach dem Aufruf der Datei Powershell, die ich habe:

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

Diese Linie durch das Verzeichnis gehen und die Verfahren legen Sie es neu erstellen wird. Wenn dies keine Entwicklungsumgebung wäre, möchte ich die Prozeduren nicht programmgesteuert auf diese Weise löschen. Ich benenne dann alle gespeicherten Prozedurdateien um.sql:

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

Und dann laufen:

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

Und das wird für alle SQL-Dateien und stellt die gespeicherten Prozeduren. Ich hoffe, dass jeder Teil davon für jemanden hilfreich sein wird.

+0

Ich mag dies. Ich habe einen Prozess für ar schreiben Stück für Stück Stück für Stück aus einer Produktionsdatenbank herauszuschneiden. Ich möchte nicht, dass SQL-Dateien hängen bleiben, die wahrscheinlich nicht aktualisiert werden, wenn das Schema entwickelt wird, also passe ich das an, um eine leere Datenbank basierend auf einem Ziel zu erstellen, ohne den Zwischenschritt des Schreibens von Dateien auf die Festplatte (mehr Aufräumen). Ich denke, das ist wahrscheinlich die beste und wiederverwendbarste Antwort auf diese Frage, Kudos, Sir! –

Verwandte Themen