I am new to SQL, and what I needed to do was to combine 2 .mdf databases into one. I did that using SQL Server 2008 Manager - Tasks > Import/Export tables.The tables and views were copied successfully, but there are no Stored procedures in the new database. Is there any way to do that?
-
1If you want to copy them programmatically, start here: http://stackoverflow.com/a/6124487/138938 – Jon Crowell May 22 '12 at 14:03
11 Answers
- Right click on database
- Tasks
- Generate Scripts
- Select the objects you wish to script
- Script to File
- Run generated scripts against target database

- 8,530
- 6
- 43
- 64
-
Hi, thanks for fast reply. Can you please explain how to use script against target database. Im new to this. – Oak May 22 '12 at 13:55
-
1@BarryKaye What if he has 30-40 stored procedures? Wouldn't right clicking be a bit slow? – rvphx May 22 '12 at 13:59
-
@Oak Open the generate Script file in SQL Management Studio. Change the Connection to your new database. Change the line at the very top of the file where it says 'Use DatabaseName' to your database and execute. – Jaimal Chohan May 22 '12 at 14:00
-
Wow. Now I thought that I was the only one who liked GUI based approach!! – rvphx May 22 '12 at 14:02
-
10@RajivVarma - you do this task once for the database - not each SP! If you tick the top-level checkbox beside "Stored Procedures" it selects them all together - 1 click. – Barry Kaye May 22 '12 at 14:06
-
When i opwn the file in SSMS, it shows an error: "Database 'E:\SQLServerEnterpriceRoot\MSSQL10.MSSQLSERVER\MSSQL\DATA\Ubelo.mdf' does not exist. Make sure that the name is entered correctly. When i try to retyoe the name, it shows a list of existing databases. And when i choose the right one, it changes the first line to "USE [Ubelo].MSSQLSERVER\MSSQL\DATA\Ubelo" and the "." is underlined (error: Incorrect syntax near '.') Any suggestions? Thanks – Oak May 22 '12 at 14:30
-
ok, got this now, it had to be just "USE [Ubelo]", and the rest of location was not deleted automatticaly, Thanks everyone for help – Oak May 22 '12 at 15:02
-
I only want to copy the procedures, not executing them. Will this work? – Allfarid Morales García Jan 03 '17 at 16:08
-
using this approach the permissions were not carried over. Do I need to set the permissions on each procedure manually? Or am doing something wrong. – eaglei22 Jan 24 '18 at 19:51
This code copies all stored procedures in the Master database to the target database, you can copy just the procedures you like by filtering the query on procedure name.
@sql is defined as nvarchar(max), @Name is the target database
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
-
Thanks!...In the comments, but not declared in the code are `@sql` & `@Name`: `DECLARE @sql NVARCHAR(MAX); DECLARE @Name NVARCHAR(32);` – datalifenyc May 06 '19 at 15:22
-
1Is there any way to do this same in different servers? From Server A To Server B? – Rajaram1991 Jan 15 '20 at 12:17
Late one but gives more details that might be useful…
Here is a list of things you can do with advantages and disadvantages
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
Here is how to get a list of all procedures in some database that don’t exist in another database
select *
from DB1.sys.procedures P
where P.name not in
(select name from DB2.sys.procedures P2)

- 586
- 6
- 5
I originally found this post looking for a solution to copying stored procedures from my remote production database to my local development database. After success using the suggested approach in this thread, I realized I grew increasingly lazy (or resourceful, whichever you prefer) and wanted this to be automated. I came across this link, which proved to be very helpful (thank you vincpa), and I extended upon it, resulting in the following file (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()
I have a .bat file that calls this, and is called from Task Scheduler. After the call to the Powershell file, I have:
for /f %f in ('dir /b d:\prod_schema_backup\stp\') do sqlcmd /S localhost /d dest_db /Q "DROP PROCEDURE %f"
That line will go thru the directory and drop the procedures it is going to recreate. If this wasn't a development environment, I would not like programmatically dropping procedures this way. I then rename all the stored procedure files to have .sql:
powershell Dir d:\prod_schema_backup\stp\ | Rename-Item -NewName { $_.name + ".sql" }
And then run:
for /f %f in ('dir /b d:\prod_schema_backup\stp\') do sqlcmd /S localhost /d dest_db /E /i "%f".sql
And that iterates through all the .sql files and recreates the stored procedures. I hope that any part of this will prove to be helpful to someone.

- 1,329
- 15
- 12
-
I'm liking this. I have to write a process for archiving chunks out of a productions DB one year at a time. I don't want to have to have SQL files hanging about which probably won't get updated as the schema develops so I'm adapting this to create an empty DB based on a target without the intermediate step of writing files to disk (more to clean up). I reckon this is probably the best and most re-usable answer on this question, kudos sir! – Steve Pettifer Apr 24 '14 at 11:18
use
select * from sys.procedures
to show all your procedures;
sp_helptext @objname = 'Procedure_name'
to get the code
and your creativity to build something to loop through them all and generate the export code :)

- 34,802
- 21
- 91
- 134
You can use SSMS's "Generate Scripts..." function to script out whatever you need to transfer. Right-click on the source database in SSMS, choose "Generate Scripts...", and follow the wizard along. Then run your resultant script that will now contain the stored procedure create statements.

- 3,485
- 1
- 15
- 18
You can generate scriptof the stored proc's as depicted in other answers. Once the script have been generated, you can use sqlcmd
to execute them against target DB like
sqlcmd -S <server name> -U <user name> -d <DB name> -i <script file> -o <output log file>

- 76,197
- 13
- 71
- 125
Another option is to transfer stored procedures using SQL Server Integration Services (SSIS). There is a task called Transfer SQL Server Objects Task. You can use the task to transfer the following items:
- Tables
- Views
- Stored Procedures
- User-Defined Functions
- Defaults
- User-Defined Data Types
- Partition Functions
- Partition Schemes
- Schemas
- Assemblies
- User-Defined Aggregates
- User-Defined Types
- XML Schema Collection
It's a graphical tutorial for Transfer SQL Server Objects Task.

- 4,579
- 3
- 29
- 49
In Mgmt Studio, right-click on your original database then Tasks then Generate Scripts... - follow the wizard.

- 7,682
- 6
- 42
- 64
SELECT definition + char(13) + 'GO' FROM MyDatabase.sys.sql_modules s INNER JOIN MyDatabase.sys.procedures p ON [s].[object_id] = [p].[object_id] WHERE p.name LIKE 'Something%'" queryout "c:\SP_scripts.sql -S MyInstance -T -t -w
get the sp and execute it

- 366
- 3
- 14
-
This is a very nice solution, but 1) you should point out that text or file output is needed (don't display the results in the grid, or you will lose EOL chars) and 2) there seems to be a limit of 8k for text output in SQL Server Management studio. – DAB Nov 07 '18 at 10:38
-- This program copies (CREATE OR ALTER) a single PROCEDURE from one database to another
declare @SourceDatabase nvarchar(50);
declare @SourceSchemaName nvarchar(50)
declare @TargetDatabase nvarchar(50);
declare @ProceduresName nvarchar(50);
declare @sql nvarchar(max)
set @SourceDatabase = N'Northwind' -- The name of the source database
set @SourceSchemaName = N'dbo' -- The name of Procedure SCHEME
set @ProceduresName = N'CustOrderHist' -- The name of Procedure
set @TargetDatabase = N'AdventureWorks' -- The name of the Target database
-- -------- - - -
-- If the PROCEDURE SCHEME does not exist, create it
set @sql = ' use [' +@TargetDatabase +'] ' +
' IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = ''' + @SourceSchemaName+''') '+
' BEGIN ' +
' EXEC('' CREATE SCHEMA '+ @SourceSchemaName +''') ' +
' END'
exec (@sql);
set @sql = ''
--
set @sql = @sql + ' use [' + @TargetDatabase +'] ;' +
' declare @sql2 nvarchar(max) ;' +
' SELECT @sql2 = coalesce(@sql2,'';'' ) + [definition] + '' ; '' ' +
' FROM ['+@sourceDatabase+'].[sys].[procedures] p ' +
' INNER JOIN ['+@sourceDatabase+'].sys.sql_modules m ON p.object_id = m.object_id '+
' where SCHEMA_NAME([schema_id]) = ''' +@SourceSchemaName +''' and [name] = N''' + @ProceduresName + ''' ; ' +
' set @sql2 = replace(@sql2,''CREATE PROCEDURE'',''CREATE OR ALTER PROCEDURE'')' +
' exec (@sql2)'
exec (@sql)

- 41
- 3