生成SQL Server数据库脚本四法
数据库开发人员或数据库管理员(DBA)为了发布数据库或备份数据库对象,常需要生成T-SQL脚本。笔者在这里对常用方法进行了总结,供朋友们参考。
方法一:使用企业管理器
进入“企业管理器”,右击数据库,选择“所有任务→生成SQL脚本”即可。
方法评价:优点是方便,且操作简单。缺点是不能在应用程序中执行。
方法二:使用SQLDMO
很多朋友喜欢通过程序生成脚本,比如使用SQLDMO,以下是一个使用SQLD MO方法生成建库脚本的例子,代码如下:
DECLARE @serverName varchar(255),--服务器名
@database varchar(255),--数据库名
@ScriptFile varchar(255)--存储的脚本文件名(路径名称)
SELECT @serverName='RD104\DBA06',
@database='Test',
@ScriptFile='c:\tt.sql'
DECLARE @cmdstr nvarchar(4000)
DECLARE @object int
DECLARE @hr int
SET @CmdStr = 'Connect('+@ServerName+')' EXEC @hr = sp_OACreate 'SQLDMO.SQLServer',@object OUT
EXEC @hr = sp_OASetProperty @object, 'LoginSecure', TRUE
EXEC @hr = sp_OAMethod @object,@CmdStr
SET @CmdStr = 'Databases("'+@database+'").Script(5,"' + @ScriptFile + '")'
EXEC @hr = sp_OAMethod @object,@CmdStr
方法评价:SQLDMO的最大优点是灵活,但缺点是使用者需要对数据的对象依存关系相当清楚,这对于SQL Server初学者来说难度较大。用SQLDMO生成脚本的方法应用很普遍,想详细了解的朋友可以在网上很容易地找到相关资料。
方法三:使用DTS
如果是MS SQL Server 7.0以上的版本,我们也可以通过DTS将源数据库的对象复制到目标数据库。在SQL Server 7.0中有一个“transfer objects”的选项。
方法评价:可以使用MS提供的图形界面,操作比较方便,还可以建立一个DTS包反复调用。缺点是对多个数据库对象分别进行控制时很不方便。
方法四:使用scptxfr.exe工具
笔者想重点介绍的工具是scptxfr.exe,SQL Server 7.0以上的版本都自带了这个工具,默认安装。SQL Server 2000安装在“\Program Files\Microsoft SQL Server\MSS QL\Upgrade”目录下。如果没有安装,可以到安装光盘上查找。
scptxfr.exe是一个带命令行参数的可执行程序,可以生成数据库所有对象的完整脚本。可在DOS命令行和各种前台开发程序内执行。
以下是生成Northwind完整SQL脚本的例子:
sp_configure 'xp_cmdshell',1
reconfigure with override
go
exec master..xp_cmdshell 'c:\"Program Files"\"Microsoft SQL Server"\MSSQL\Upgrade\scptxfr.exe/s serverName /d databaseName /P SApassword /f c:\test.sql /q /r /T'方法评价:该方法综合了以上方法的优点,不用考虑对象依存关系,一次性全部生成,且用法相当简单。对于初学者来说更是个不可多得的好工具。
小资料:scptxfr.exe
语法格式:
SCPTXFR/s <服务器> /d <数据库> {[/I] | [/P <密码>]}
{[/F <脚本文件目录>] | [/f <单个脚本文件>]}
/q /r /O /T /A /E /C /N /X /H /G /Y /?
参数说明:
/s 指示要连接到的源服务器。
/d 指示要为之编写脚本的源数据库。
/I 使用集成安全性。
/P sa要用的密码。请注意,登录 ID始终为sa。若不使用/P或标志后面没有密码,则将使用空密码。不与/I兼容。
/F 脚本文件应生成到的目录。这意味着为每个对象分类生成一个文件。
/f 所有脚本将保存到的单个文件。不与/F兼容。
/q 在所生成的脚本中使用被引用的标志符。
/r 脚本中的对象包括drop语句。
/O 生成OEM脚本文件。无法用于/A或/T。
/T 生成UNICODE脚本文件。无法用于/A或/O。
/A 生成ANSI脚本文件。无法用于/T或/O。
/? 命令行帮助。
/E 发生错误时停止脚本编写。默认行为是记录该错误然后继续。
/C 指示替代服务器CodePage(代码页)。
/N 生成ANSI PADDING。
/X 编写SP和XP脚本以分隔文件。
/H 生成不带首部的脚本文件。默认带首部。
/G 使用指定的服务器名称作为所生成的输出文件的前缀。
/Y 为“扩展属性”生成脚本(仅对8.x服务器有效)。
USE [master]
GO
/****** Object: StoredProcedure [dbo].[sp__GenerateScript] Script Date: 12/29/2010 15:31:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER proc [dbo].[sp__GenerateScript]
@dbname varchar(256) = '',
@Applicationpath varchar(700) ='C:\Program Files\Microsoft SQL Server\Tool\',
@destinationpath varchar(700) ='D:\MSSQLScripts\',
@switches varchar(200) = ' /X /Y /A /q /r /G /I '
as
--Created by:MAK
--Date: Aug 28, 2004
--Objective: Generate SQl Scripts for all or given database
set quoted_identifier off
set nocount on
set concat_null_yields_null off
declare @count int
declare @folderexist int
declare @maxcount int
declare @query varchar(1000)
declare @date varchar(10)
set @date = convert(varchar(10),getdate(),112)
set @count =1
Print 'Generate Script - Started'
print getdate()
set @Applicationpath = @Applicationpath +'scptxfr.exe'
create table #dbtable (id int identity(1,1), dbname varchar(256))
if @dbname = ''
begin
insert into #dbtable (dbname) select name from
master..sysdatabases
where name != 'tempdb' and status & 32 != 32
and status & 256 != 256 and status & 512 != 512
and status & 1024 != 1024 and status & 4096 != 4096
and status & 32768 !=32768 and status & 1073741824 !=1073741824
end
else
begin
insert into #dbtable (dbname) select name from
master..sysdatabases
where name != 'tempdb' and status & 32 != 32
and status & 64 != 64 and status & 128 != 128
and status & 256 != 256 and status & 512 != 512
and status & 1024 != 1024 and status & 4096 != 4096
and status & 32768 !=32768 and status & 1073741824 !=1073741824
and name = @dbname
end
if (select count(*) from #dbtable) = 0
begin
set @date = convert(varchar(100), getdate(),109)
Print 'Error: No valid database found for Generating Script'
end
else
begin
set @destinationpath = @destinationpath +@date
create table #files (Files int, Folder int, parent int)
insert #files exec master.dbo.xp_fileexist @destinationpath
select @folderexist = Folder from #files
if @folderexist <>1
begin
set @query = 'MKDIR "'+@destinationpath+'"'
print @query
exec master..xp_cmdshell @query
set @destinationpath = @destinationpath
end
else
begin
print 'Information:'+ @destinationpath + ' already exist. Skipping Folder Creation'
end
set @maxcount = (select max(id) from #dbtable)
While @count <= @maxcount
begin
set @dbname = (select dbname from #dbtable where id = @count)
set @query = '"'+@applicationpath +'"'+ ' /s '+@@servername+ ' /d '+@dbname+ +' /F '+@destinationpath+ @switches
set @query = @query
print @query
exec master..xp_cmdshell @query
if @@error <> 0
begin
Print 'Error'
end
set @count = @count+1
end
end
print getdate()
Print 'Generate Script - Completed'
















