注册 登录 欢迎您访问极限源码网:专注各类网站源码下载。

数据库教程

该栏目主要发布各类网站数据库技术教程

合并SQL脚本文件的方法分享

极限源码网 2019-05-04 20:53 数据库教程

概述 
-------------------------------------------------------------------------------- 
在平时的工作中,我会经常的碰到这样需要合并SQL脚本的问题。如,有很多的SQL脚本文件,需要按照一定的先后顺序,再生成一个合并SQL脚本文件,然后再发布到用户SQL Server服务器上。 
合并SQL脚本文件,最直接的方法就是新建1个空白的SQL脚本文件,再把需要合并的SQL脚本文件内容复制到新建的SQL文件中。当初,我合并脚本的操作方法与刚说的有类似。我在Microsoft SQL Server Management Studio(MSSMS)新建一个查询,再把要合并的SQL脚本文件,一个一个的打开,并复制内容到新建查询中,然后生成合并脚本文件。 
上面的方法,对于几个SQL脚本文件合并来说,似乎没什么问题。但是,当我们要合并的脚本很多,一文件一个文件的内容复制,是比较繁琐的事情,要是能有1个简单合并脚本工具就最好不过了。下面介绍我写的两个合并SQL脚本文件的存储过程. 
第1个存储过程,只要调用sp_OACreate实现合并SQL脚本文件。 

复制代码 代码如下:


use master 
Go 
if object_id('sp_ScriptMerge') Is Not Null 
Drop proc sp_ScriptMerge 
Go 
Create Proc sp_ScriptMerge 

@Path nvarchar(1024), 
@FilesList nvarchar(max)= null, 
@NewFileName nvarchar(1024)=null 

As 
/*合并SQL脚本文件(SQL)V1.0 Andy 2011-9-1*/ 
Declare 
@ScriptNr nchar(21), 
@subdirectoryStr nvarchar(512), 
@Dir nvarchar(1024), 
@ScriptCount int 
Declare @subdirectoryTB Table (subdirectory nvarchar(512),depth smallint,[file] smallint) 
Declare @tmp table(row smallint identity primary key,fileName nvarchar(512)) 
Set Nocount on 
if right(@Path,1)<>'\' Set @Path=@Path+'\' 
If Isnull(@NewFileName,'')='' Set @NewFileName=N'合并脚本-'+Convert(nvarchar(8),getdate(),112) 
if lower(right(@NewFileName,4))<>'.sql' Set @NewFileName=@NewFileName+'.sql' 
Set @NewFileName=@Path+@NewFileName 
Set @ScriptNr='Nr: '+Replace(replace(Replace(replace(convert(nvarchar(23),getdate(),121),'-',''),':',''),' ',''),'.','') 
Set @ScriptCount=0 
/*读取脚本文件内容*/ 
if @FilesList >'' 
Begin 
Set @FilesList='Select N'''+replace(@FilesList,',',''' Union All Select N''')+'''' 
Insert into @tmp([fileName]) Exec(@FilesList) 
End 
if object_id('Tempdb..#') Is Not Null Drop Table # 
Create table #(row int identity(1,1) Primary key,text nvarchar(max)) 
Insert into @subdirectoryTB Exec xp_dirtree @Path,1,1 
Declare cur_file cursor for 
Select a.subdirectory 
From @subdirectoryTB As a 
left Join @tmp As b ON b.fileName=a.subdirectory 
Where a.[file]=1 And a.subdirectory like '%.sql' 
And (b.fileName=a.subdirectory Or Not Exists(Select 1 From @tmp)) 
Order By isnull(b.row,0),a.subdirectory 
Open cur_file 
fetch next From cur_file into @subdirectoryStr 
While @@FETCH_STATUS = 0 
Begin 
Set @ScriptCount=@ScriptCount+1 
Insert into #(text) Select +Char(13)+Char(10)+ N'Go'+Char(13)+Char(10)+ N'/* '+@ScriptNr+' ('+rtrim(@ScriptCount)+'): '+@subdirectoryStr+' */'+Char(13)+Char(10)+ N'Go'+Char(13)+Char(10) 
Set @Dir='Type '+@Path+'"'+@subdirectoryStr+'"' 
Insert into #(text) 
Exec sys.xp_cmdshell @Dir 
fetch next From cur_file into @subdirectoryStr 
End 
Close cur_file 
Deallocate cur_file 
if @ScriptCount >0 Insert into #(text) Select +Char(13)+Char(10)+ N'Go'+Char(13)+Char(10)+ N'/* '+@ScriptNr+' 合并完成(合计 '+rtrim(@ScriptCount)+' 各脚本文件). */'+Char(13)+Char(10)+ N'Go'+Char(13)+Char(10) 
/*写入合并脚本文件*/ 
if @ScriptCount>0 
Begin 
Declare @object int, 
@FileID int, 
@hr int, 
@src varchar(255), 
@desc varchar(255), 
@row int, 
@text nvarchar(max) 
Exec @hr=sp_OACreate 'Scripting.FileSystemObject',@object output 
If @hr <> 0 Goto File_ErrorHandler 
Exec @hr = sp_OAMethod @object,'CreateTextFile',@FileID OUTPUT, @NewFileName 
If @hr <> 0 Goto File_ErrorHandler 
Set @row=1 
While Exists(Select 1 From # Where row=@row) 
Begin 
Set @text=(Select text From # Where row=@row) 
Exec @hr = sp_OAMethod @FileID, 'WriteLine', NULL, @text 
Set @row=@row +1 
End 
Goto File_Done 
File_ErrorHandler: 
Print N'*********** 读写文件的时候发生错误 ***********' 
Exec @hr=sp_OAGetErrorInfo @object, @src OUT, @desc OUT 
Select convert(varbinary(4),@hr) As hr, @src As Source, @desc As Description 
File_Done: 
Exec @hr = sp_OADestroy @FileID 
Exec @hr = sp_OADestroy @object 
Print N'*********** 合并脚本完成 ***********' 
Print N'合并后脚本文件: '+@NewFileName 
End 
Go 


调用上面存储过程前,需要确认启用 OLE Automation Procedures和xp_cmdshell 选项: 

复制代码 代码如下:


调用上面存储过程前,需要确认启用 OLE Automation Procedures和xp_cmdshell 选项: 

复制代码 代码如下:


服务项目

源码下载

关于我们

极限源码网| https://www.jxym.net

极限源码网(JXYM.NET)由一批热爱网页设计、敢于追求梦想、努力付诸行动的热火青年联合打造,在我们的努力之下,让您拥有一个全方位的源码下载平台