Eu sou novo em SQL, e o que eu precisava fazer era combinar 2 bancos de dados .mdf em um. Fiz isso usando o SQL Server 2008 Manager - Tarefas> Importar / Exportar tabelas. As tabelas e visualizações foram copiadas com êxito, mas não há procedimentos armazenados no novo banco de dados. Existe alguma maneira de fazer isso?
sql
sql-server-2008
copy
procedures
Carvalho
fonte
fonte
Respostas:
fonte
Este código copia todos os procedimentos armazenados no banco de dados Master para o banco de dados de destino. Você pode copiar apenas os procedimentos que desejar, filtrando a consulta no nome do procedimento.
@sql é definido como nvarchar (max), @Name é o banco de dados de destino
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
fonte
@sql
&@Name
:DECLARE @sql NVARCHAR(MAX); DECLARE @Name NVARCHAR(32);
Mais tarde, mas dá mais detalhes que podem ser úteis ...
Aqui está uma lista de coisas que você pode fazer com vantagens e desvantagens
Gerar scripts usando SSMS
Ferramentas de terceiros
Visualizações do sistema
Aqui está como obter uma lista de todos os procedimentos em algum banco de dados que não existem em outro banco de dados
select * from DB1.sys.procedures P where P.name not in (select name from DB2.sys.procedures P2)
fonte
Originalmente, encontrei esta postagem procurando uma solução para copiar procedimentos armazenados de meu banco de dados de produção remoto para meu banco de dados de desenvolvimento local. Após o sucesso usando a abordagem sugerida neste tópico, percebi que estava ficando cada vez mais preguiçoso (ou engenhoso, o que você preferir) e queria que isso fosse automatizado. Encontrei este link , que se mostrou muito útil (obrigado vincpa), e o estendi, resultando no seguinte arquivo (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()
Eu tenho um arquivo .bat que chama isso e é chamado do Agendador de tarefas. Após a chamada para o arquivo Powershell, eu tenho:
for /f %f in ('dir /b d:\prod_schema_backup\stp\') do sqlcmd /S localhost /d dest_db /Q "DROP PROCEDURE %f"
Essa linha passará pelo diretório e descartará os procedimentos que vai recriar. Se este não fosse um ambiente de desenvolvimento, eu não gostaria de descartar os procedimentos programaticamente dessa maneira. Em seguida, renomeio todos os arquivos de procedimento armazenado para ter .sql:
powershell Dir d:\prod_schema_backup\stp\ | Rename-Item -NewName { $_.name + ".sql" }
E então execute:
for /f %f in ('dir /b d:\prod_schema_backup\stp\') do sqlcmd /S localhost /d dest_db /E /i "%f".sql
E isso itera por meio de todos os arquivos .sql e recria os procedimentos armazenados. Espero que qualquer parte disso seja útil para alguém.
fonte
Você pode usar a função "Gerar Scripts ..." do SSMS para criar um script de tudo o que você precisa transferir. Clique com o botão direito no banco de dados de origem no SSMS, escolha "Gerar scripts ..." e siga o assistente. Em seguida, execute o script resultante que agora conterá as instruções de criação do procedimento armazenado.
fonte
usar
select * from sys.procedures
para mostrar todos os seus procedimentos;
para obter o código
e sua criatividade para construir algo para percorrer todos eles e gerar o código de exportação :)
fonte
Você pode gerar script dos procs armazenados conforme descrito em outras respostas. Uma vez que o script foi gerado, você pode usar
sqlcmd
para executá-los no banco de dados de destino, comofonte
No Mgmt Studio, clique com o botão direito do mouse em seu banco de dados original, em Tarefas e em Gerar scripts ... - siga o assistente.
fonte
SELECT definição + char (13) + 'GO' FROM MyDatabase.sys.sql_modules s INNER JOIN MyDatabase.sys.procedures p ON [s]. [Object_id] = [p]. [Object_id] ONDE p.name LIKE 'Something% '"queryout" c: \ SP_scripts.sql -S MyInstance -T -t -w
pegue o sp e execute-o
fonte
Outra opção é transferir procedimentos armazenados usando o SQL Server Integration Services (SSIS) . Há uma tarefa chamada Transferir Objetos do SQL Server Task . Você pode usar a tarefa para transferir os seguintes itens:
É um tutorial gráfico para Transferir Tarefa de Objetos do SQL Server.
fonte