Вопрос по sql, sql-server-2008 – SQL Server - копировать хранимые процедуры из одной БД в другую

76

Я новичок в SQL, и мне нужно было объединить две базы данных .mdf в одну. Я сделал это с помощью диспетчера SQL Server 2008 - Задачи & gt; Импорт / экспорт таблиц. Таблицы и представления были успешно скопированы, но в новой базе данных нет хранимых процедур. Есть ли способ сделать это?

Если вы хотите скопировать их программно, начните здесь:stackoverflow.com/a/6124487/138938 Jon Crowell

Ваш Ответ

9   ответов
123
Right click on database Tasks Generate Scripts Select the objects you wish to script Script to File Run generated scripts against target database
@RajivVarma - вы выполняете эту задачу один раз для базы данных - не для каждого SP! Если вы отметите флажок верхнего уровня рядом с «Хранимыми процедурами» он выбирает их все вместе - 1 клик.
@RajivVarma - почему бы и нет?
@BarryKaye Что делать, если у него 30-40 хранимых процедур? Разве щелчок правой кнопкой мыши не будет медленным?
Привет, спасибо за быстрый ответ. Можете ли вы объяснить, как использовать скрипт против целевой базы данных. Я новичок в этом. Oak
Но это не будет хорошо для многих процедур магазина.
3

использование

select * from sys.procedures

показать все ваши процедуры;

sp_helptext @objname = 'Procedure_name'

чтобы получить код

и ваше творчество, чтобы построить что-то, чтобы пройти через все это и генерировать экспортный код :)

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 и воссоздает хранимые процедуры. Я надеюсь, что любая часть этого окажется полезной для кого-то.

Мне это нравится. Я должен написать процесс архивирования кусков из производственной БД по одному году за раз. Я не хочу, чтобы зависали файлы SQL, которые, вероятно, не будут обновляться по мере развития схемы, поэтому я адаптирую это для создания пустой БД на основе цели без промежуточного этапа записи файлов на диск (m , руду убирать). Я считаю, что это, вероятно, лучший и наиболее пригодный для повторения ответ на этот вопрос, слава Богу!
0

FROM MyDatabase.sys.sql_modules s ВНУТРЕННЕЕ СОЕДИНЕНИЕ MyDatabase.sys.procedures p ON [s]. [Object_id] = [p]. [Object_id] WHERE p.name LIKE & quot; Something% & quot; queryout & quot; c: \ SP_scripts.sql -S MyInstance -T -t -w

получить sp и выполнить его

Это очень хорошее решение, но 1) вы должны указать, что необходим вывод текста или файла (не отображать результаты в сетке, иначе вы потеряете символы EOL) и 2) кажется, что ограничение составляет 8 КБ. для вывода текста в SQL Server Management studio.
5

но приводятся дополнительные сведения, которые могут быть полезны & # x2026;

Вот список вещей, которые вы можете сделать с преимуществами и недостатками

Generate scripts using SSMS

Pros: extremely easy to use and supported by default Cons: scripts might not be in the correct execution order and you might get errors if stored procedure already exists on secondary database. Make sure you review the script before executing.

Third party tools

Pros: tools such as ApexSQL Diff (this is what I use but there are many others like tools from Red Gate or Dev Art) will compare two databases in one click and generate script that you can execute immediately Cons: these are not free (most vendors have a fully functional trial though)

System Views

Pros: You can easily see which stored procedures exist on secondary server and only generate those you don’t have. Cons: Requires a bit more SQL knowledge

Вот как можно получить список всех процедур в какой-либо базе данных, которых нет в другой базе данных

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

затем «Задачи», а затем «Создать сценарии ...» - следуйте указаниям мастера.

3

Создать сценарии ... & quot; функция, чтобы написать все, что вам нужно передать. Щелкните правой кнопкой мыши исходную базу данных в SSMS, выберите «Создать сценарии ...» и следуйте указаниям мастера. Затем запустите ваш результирующий скрипт, который теперь будет содержать операторы создания хранимой процедуры.

3

как показано в других ответах. После того, как скрипт был сгенерирован, вы можете использоватьsqlcmd выполнить их против целевой БД, как

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

ю базу данных. Вы можете скопировать только те процедуры, которые вам нравятся, отфильтровав запрос по имени процедуры.

@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

Похожие вопросы