Soy nuevo en SQL y lo que tenía que hacer era combinar 2 bases de datos .mdf en una. Lo hice usando SQL Server 2008 Manager - Tareas> Importar / Exportar tablas. Las tablas y vistas se copiaron correctamente, pero no hay procedimientos almacenados en la nueva base de datos. ¿Hay alguna manera de hacerlo?
sql
sql-server-2008
copy
procedures
Roble
fuente
fuente
Respuestas:
fuente
Este código copia todos los procedimientos almacenados en la base de datos maestra en la base de datos de destino, puede copiar solo los procedimientos que desee filtrando la consulta por el nombre del procedimiento.
@sql se define como nvarchar (max), @Name es la base de datos 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
fuente
@sql
&@Name
:DECLARE @sql NVARCHAR(MAX); DECLARE @Name NVARCHAR(32);
Tarde uno pero da más detalles que podrían ser útiles ...
Aquí hay una lista de cosas que puede hacer con ventajas y desventajas
Genere scripts usando SSMS
Herramientas de terceros
Vistas del sistema
A continuación se explica cómo obtener una lista de todos los procedimientos en alguna base de datos que no existen en otra base de datos
select * from DB1.sys.procedures P where P.name not in (select name from DB2.sys.procedures P2)
fuente
Originalmente encontré esta publicación buscando una solución para copiar procedimientos almacenados desde mi base de datos de producción remota a mi base de datos de desarrollo local. Después de utilizar con éxito el enfoque sugerido en este hilo, me di cuenta de que me volvía cada vez más perezoso (o ingenioso, lo que prefieras) y quería que esto se automatizara. Encontré este enlace , que resultó ser muy útil (gracias vincpa), y lo extendí, dando como resultado el siguiente archivo (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()
Tengo un archivo .bat que llama a esto y se llama desde el Programador de tareas. Después de la llamada al archivo Powershell, tengo:
for /f %f in ('dir /b d:\prod_schema_backup\stp\') do sqlcmd /S localhost /d dest_db /Q "DROP PROCEDURE %f"
Esa línea pasará por el directorio y eliminará los procedimientos que va a recrear. Si este no fuera un entorno de desarrollo, no me gustaría descartar procedimientos mediante programación de esta manera. Luego cambio el nombre de todos los archivos de procedimiento almacenado para tener .sql:
powershell Dir d:\prod_schema_backup\stp\ | Rename-Item -NewName { $_.name + ".sql" }
Y luego ejecuta:
for /f %f in ('dir /b d:\prod_schema_backup\stp\') do sqlcmd /S localhost /d dest_db /E /i "%f".sql
Y eso itera a través de todos los archivos .sql y recrea los procedimientos almacenados. Espero que alguna parte de esto resulte útil para alguien.
fuente
Puede utilizar la función "Generar secuencias de comandos ..." de SSMS para generar secuencias de comandos para lo que necesite transferir. Haga clic con el botón derecho en la base de datos de origen en SSMS, seleccione "Generar secuencias de comandos ..." y siga el asistente. Luego, ejecute su script resultante que ahora contendrá las instrucciones de creación del procedimiento almacenado.
fuente
utilizar
select * from sys.procedures
para mostrar todos sus procedimientos;
para obtener el código
y su creatividad para construir algo para recorrerlos todos y generar el código de exportación :)
fuente
Puede generar un script de los procesos almacenados como se muestra en otras respuestas. Una vez que se ha generado el script, puede usarlo
sqlcmd
para ejecutarlo contra la base de datos de destino comofuente
En Mgmt Studio, haga clic con el botón derecho en su base de datos original, luego en Tareas y luego en Generar scripts ... - siga el asistente.
fuente
SELECCIONAR definición + char (13) + 'IR' DE MyDatabase.sys.sql_modules s INNER JOIN MyDatabase.sys.procedures p ON [s]. [Object_id] = [p]. [Object_id] DONDE p.name LIKE 'Something% '"queryout" c: \ SP_scripts.sql -S MyInstance -T -t -w
obtener el sp y ejecutarlo
fuente
Otra opción es transferir procedimientos almacenados mediante SQL Server Integration Services (SSIS) . Hay una tarea llamada Tarea Transferir objetos de SQL Server . Puede utilizar la tarea para transferir los siguientes elementos:
Es un tutorial gráfico para la tarea Transferir objetos de SQL Server.
fuente