一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - 合并SQL腳本文件的方法分享

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

2019-12-07 17:02MSSQL教程網 Sql Server

在平時的工作中,我會經常的碰到這樣需要合并SQL腳本的問題。如,有很多的SQL腳本文件,需要按照一定的先后順序,再生成一個合并SQL腳本文件,然后再發布到用戶SQL Server服務器上。

概述 
-------------------------------------------------------------------------------- 
在平時的工作中,我會經常的碰到這樣需要合并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 選項: 

復制代碼代碼如下:


Exec sys.sp_configure @configname = 'show advanced options',@configvalue = 1 
reconfigure 
go 
Exec sys.sp_configure @configname = 'xp_cmdshell',@configvalue = 1 
reconfigure 
Go 
Exec sys.sp_configure @configname = 'Ole Automation Procedures',@configvalue = 1 
reconfigure 
Go 


測試: 

復制代碼代碼如下:


use master 
GO 
Exec master.dbo.sp_ScriptMerge 
@Path = 'C:\Users\Administrator\Desktop\temp', -- nvarchar(1024) 
@FilesList = '', -- nvarchar(max) 
@NewFileName = '合并腳本20110905.sql' -- nvarchar(1024) 


*********** 合并腳本完成 ***********合并后腳本文件: C:\Users\Administrator\Desktop\temp\合并腳本20110905.sql第2個是CLR存儲過程,使用C#代碼實現合并SQL腳本文件。 
-------------------------------------------------------------------------------- 
C#代碼: 

復制代碼代碼如下:


using System; 
using System.Data; 
using System.Data.SqlClient; 
using Microsoft.SqlServer.Server; 
using System.Data.SqlTypes; 
using System.IO; 
using System.Text; 
public class clScriptMerge 

[Microsoft.SqlServer.Server.SqlProcedure] 
public static void SQLScriptMerge(string Path, string FilesList, string NewFileName) 

try 

string[] strFiles ; 
FileInfo[] myFileInfo = (new DirectoryInfo(Path)).GetFiles("*.sql"); 
string strScriptNr = @"Nr" + DateTime.Now.ToString("yyyyMMddHHmmssFFF"); 
int intCount=0; 
if (NewFileName == null || NewFileName=="") 

NewFileName = "合并腳本" + DateTime.Now.ToString("yyyyMMdd") + ".sql"; 

SqlContext.Pipe.Send(NewFileName.ToString()); //打印已合并的SQL文件名 
// 1.獲得SQL腳本列表 
if (FilesList != "") 

strFiles = FilesList.Split(','); //篩分SQL腳本文件名列表,以","分隔 

else 

strFiles = new string[myFileInfo.Length]; 
for (int i = 0; i < myFileInfo.Length; i++) 

strFiles[i] = myFileInfo[i].Name; 


// 2.合并腳本 
SqlContext.Pipe.Send("【SQL腳本文件列表】:\n--------------------------------------------"); 
StreamWriter SW = new StreamWriter(Path + @"\" + NewFileName, true, Encoding.Unicode); //使用Unicode編碼 
SW.WriteLine(@"Go\n/*============ " + strScriptNr + "====Start===================================*/\nGo\n"); //記錄生成的合并腳本編號&合并動作的開始位置 
foreach (string strFile in strFiles) 

if (strFile !=NewFileName) 

intCount += 1; 
SW.WriteLine(@"/* " + strScriptNr +@" ("+intCount+@"): " + strFile + "*/\nGo\n"); //記錄合并哪一個腳本文件 
using (StreamReader SR = new StreamReader(Path + @"\" + strFile, Encoding.Default)) 

string line; 
while ((line = SR.ReadLine()) != null) 

SW.WriteLine(line); 

SR.Close(); 

SqlContext.Pipe.Send(strFile.ToString()); //打印已合并的SQL文件名 


SW.WriteLine(@"/*============ " + strScriptNr + "====End (一共 " + intCount + " 個文件)===================================*/\nGo\n"); //記錄生成的合并腳本文件個數&合并動作的結束位置 
SW.Close(); 
SqlContext.Pipe.Send("\n\n【合成后文件】:\n--------------------------------------------\n" + NewFileName); 

catch (System.Exception e) 

SqlContext.Pipe.Send("\n在方法SQLScriptMerge內發生錯誤: \n\n" + e.ToString()); 



存儲過程代碼: 

復制代碼代碼如下:


Use master 
GO 
--啟動CLR 
Exec sp_configure 'clr enable',1 
Go 
Reconfigure 
GO 
--先設置數據庫選項 
Alter Database Master Set TRUSTWORTHY On 
Go 
--存儲過程 
If object_id('sp_ScriptMerge2') Is Not Null 
Drop Proc sp_ScriptMerge2 
Go 
If Exists(Select 1 From sys.assemblies Where Name=N'ScriptMerge') 
Drop Assembly ScriptMerge 
Go 
Create Assembly ScriptMerge 
From 'E:\Test\Objects\ISTest\ScriptMerge\ScriptMerge\bin\Debug\ScriptMerge.dll' 
create proc sp_ScriptMerge2 

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

As External Name ScriptMerge.clScriptMerge.SQLScriptMerge 
Go 


以上的CLR存儲過程代碼是在SQL Server 2005 & Microsoft Visual Studio 2005下運行通過。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美日韩国产精品自在自线 | 女人张开腿让男人桶视频免费大全 | 国产靠逼视频 | 99热这里只有精品免费 | 毛片免费网站 | 色综合久久98天天综合 | 美女撒尿部位无遮挡 | 蜜桃传媒在线 | 欧美成人精品福利在线视频 | 亚洲国产精品久久卡一 | 99精品视频只99有精品 | 日本在线色 | 久久 这里只精品 免费 | 日本在线观看免费高清 | 久久精品手机观看 | 色先锋 影音先锋a 资源站 | 四虎国产| 国产好深好硬好爽我还要视频 | 无人区在线观看免费视频国语 | 俄罗斯激情性孕妇孕交大全 | 国产a一级毛片午夜剧院 | dyav午夜片 | 国产乱子伦在线观看不卡 | 美女扒开胸罩露出奶了无遮挡免费 | 欧美精品一区二区三区免费 | 成人亚洲欧美综合 | 天天白天天谢天天啦 | 日本嫩模| 王淑兰李思雨李铁柱乡村小说免费 | 情乱奶水欲 | 午夜影院免费观看视频 | 成年人免费观看 | katsuniav在线播放 | 色欲麻豆国产福利精品 | 精品无码乱码AV | 好大好硬好深好爽想要之黄蓉 | 欧美一区二区视频 | 视频一区在线免费观看 | 欧美综合在线 | porono日本人xxx | 日本春菜花在线中文字幕 |