Я новичок в SQL, и мне нужно было объединить 2 базы данных .mdf в одну. Я сделал это с помощью диспетчера SQL Server 2008 - Задачи> Импорт / экспорт таблиц. Таблицы и представления были успешно скопированы, но в новой базе данных нет хранимых процедур. Есть ли способ это сделать?
86
Ответы:
источник
Этот код копирует все хранимые процедуры в базе данных Master в целевую базу данных, вы можете скопировать только те процедуры, которые вам нравятся, отфильтровав запрос по имени процедуры.
@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
&@Name
:DECLARE @sql NVARCHAR(MAX); DECLARE @Name NVARCHAR(32);
Поздно, но дает более подробную информацию, которая может быть полезна ...
Вот список того, что можно сделать с преимуществами и недостатками.
Создавать скрипты с помощью SSMS
Сторонние инструменты
Системные представления
Вот как получить список всех процедур в одной базе данных, которых нет в другой базе данных.
select * from DB1.sys.procedures P where P.name not in (select name from DB2.sys.procedures P2)
источник
Первоначально я нашел этот пост в поисках решения для копирования хранимых процедур из моей удаленной производственной базы данных в мою локальную базу данных разработки. После успешного использования предлагаемого в этой ветке подхода я понял, что становлюсь все более ленивым (или находчивым, как вам больше нравится) и хотел, чтобы это было автоматизировано. Я наткнулся на эту ссылку , которая оказалась очень полезной (спасибо, 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 и воссоздает хранимые процедуры. Я надеюсь, что любая часть этого окажется кому-то полезной.
источник
Вы можете использовать функцию SSMS «Generate Scripts ...» для написания скриптов, которые вам нужно передать. Щелкните правой кнопкой мыши исходную базу данных в SSMS, выберите «Создать сценарии ...» и следуйте инструкциям мастера. Затем запустите полученный сценарий, который теперь будет содержать операторы создания хранимой процедуры.
источник
использовать
select * from sys.procedures
показать все свои процедуры;
получить код
и ваше творчество, чтобы создать что-то, чтобы перебрать их все и сгенерировать код экспорта :)
источник
Вы можете сгенерировать скрипт сохраненных процессов, как показано в других ответах. После того, как сценарий был сгенерирован, вы можете использовать его
sqlcmd
для выполнения в целевой БД, напримеристочник
В Mgmt Studio щелкните правой кнопкой мыши исходную базу данных, затем «Задачи», затем «Создать сценарии» ... - следуйте указаниям мастера.
источник
ВЫБЕРИТЕ определение + char (13) + 'GO' FROM MyDatabase.sys.sql_modules s ВНУТРЕННЕЕ СОЕДИНЕНИЕ MyDatabase.sys.procedures p ON [s]. [Object_id] = [p]. [Object_id] WHERE p.name LIKE 'Something% '"запрос" c: \ SP_scripts.sql -S MyInstance -T -t -w
получить sp и выполнить его
источник
Другой вариант - передать хранимые процедуры с помощью служб SQL Server Integration Services (SSIS) . Есть задача под названием «Задача передачи объектов SQL Server» . Вы можете использовать задание для передачи следующих предметов:
Это графическое руководство для задачи передачи объектов SQL Server.
источник