Я новичок в SQL, и мне нужно было объединить 2.mdf базы данных в один. Я сделал это с помощью SQL Server 2008 Manager - Tasks > Import/Export tables. Таблицы и представления были скопированы успешно, но в новой базе данных нет хранимых процедур. Есть ли способ сделать это?
SQL Server - копирование хранимых процедур из одной базы данных в другую
Ответ 1
- Щелкните правой кнопкой мыши по базе данных
 - Задачи
 - Сгенерировать скрипты
 - Выберите объекты, которые хотите script
 - Script в файл
 - Запуск сгенерированных скриптов с целевой базой данных
 
Ответ 2
Этот код копирует все хранимые процедуры в основной базе данных в целевую базу данных, вы можете скопировать только те процедуры, которые вам нравятся, путем фильтрации запроса по имени процедуры.
@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
		Ответ 3
Позднее, но дает более подробную информацию, которая может быть полезна...
Вот список вещей, которые вы можете сделать с преимуществами и недостатками
Сгенерировать скрипты с помощью SSMS
- Плюсы: чрезвычайно прост в использовании и поддерживается по умолчанию
 - Против: скрипты могут быть не в правильном порядке выполнения, и вы можете получить ошибки, если хранимая процедура уже существует во вторичной базе данных. Перед выполнением убедитесь, что вы просмотрели script.
 
Инструменты сторонних разработчиков
- Плюсы:, такие как ApexSQL Diff (это то, что я использую, но есть много других, таких как инструменты из Red Gate или Dev Art) будет сравнивать две базы данных одним щелчком мыши и генерировать script, которые вы можете выполнить немедленно
 - Минусы: они не являются бесплатными (большинство поставщиков имеют полнофункциональное тестирование)
 
Системные представления
- Плюсы:. Вы можете легко увидеть, какие хранимые процедуры существуют на вторичном сервере и генерировать только те, которые у вас нет.
 - Минусы: Требуется немного больше знаний SQL
 
Вот как получить список всех процедур в некоторой базе данных, которые не существуют в другой базе данных
select *
from DB1.sys.procedures P
where P.name not in 
 (select name from DB2.sys.procedures P2)
		Ответ 4
Я изначально нашел это сообщение, ища решение для копирования хранимых процедур из моей базы данных удаленных производств в мою локальную базу данных разработки. После успеха, используя предложенный подход в этой теме, я понял, что становлюсь все более ленивым (или находчивым, в зависимости от того, что вы предпочитаете) и хотел, чтобы это было автоматизировано. Я наткнулся на эту ссылку, которая оказалась очень полезной (спасибо 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 файлы и воссоздает хранимые процедуры. Я надеюсь, что любая часть этого окажется полезной для кого-то.
Ответ 5
Вы можете использовать SSMS "Сгенерировать скрипты..." до script из того, что вам нужно передать. Щелкните правой кнопкой мыши исходную базу данных в SSMS, выберите "Сгенерировать скрипты..." и следуйте указаниям мастера. Затем запустите результирующий script, который теперь будет содержать инструкции создания хранимой процедуры.
Ответ 6
использовать
select * from sys.procedures
чтобы показать все ваши процедуры;
sp_helptext @objname = 'Procedure_name'
чтобы получить код
и ваш творческий потенциал, чтобы создать что-то, чтобы перебрать их все и сгенерировать код экспорта:)
Ответ 7
Вы можете сгенерировать скрипт хранимой процедуры, как показано в других ответах. После создания script вы можете использовать sqlcmd для их выполнения против целевого БД, например
sqlcmd -S <server name> -U <user name> -d <DB name> -i <script file> -o <output log file> 
		Ответ 8
В Mgmt Studio щелкните правой кнопкой мыши исходную базу данных, затем Задачи, затем сгенерируйте скрипты... - следуйте за мастером.
Ответ 9
Определение 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. имя LIKE 'Something%' "queryout" c:\SP_scripts.sql -S MyInstance -T -t -w
получить sp и выполнить его