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

概述
--------------------------------------------------------------------------------
在平时的工作中,我会经常的碰到这样需要合并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下运行通过。

时间: 2024-10-01 16:54:36

合并SQL脚本文件的方法分享_MsSql的相关文章

SQLserver 2008将数据导出到Sql脚本文件的方法_mssql2008

请看下面的操作图解. 1.使用Sql Server Management Studio 2008 连接数据库. 2.选中要导出数据的数据库节点,点鼠标右键,在菜单中选择"任务"->"生成脚本",如图: 3.在弹出的界面中,点2次"下一步"进入如图界面中,把"编写数据的脚步"置为true. 4.其它的操作点"下一步"即可.下图是最后生成的Sql脚本: 注意:这里一定要使用Sql Server Manag

.NET调用dat文件(dat文件调用sql脚本文件)路径问题,在线等

问题描述 sql脚本文件的父文件夹跟.dat文件同级..dat问价代码如下[isql-Usa-Psa-iSQL2000/jobs.sqlpause::pause按任意键继续...exit::exit退出]直接运行dat文件效果如下c:documentsandsettingsadministrator桌面bat执行SQL文件>isql-Usa-Psa-iSQL2000/jobs.sql执行成功!.net用Process的start方法调用dat文件时效果如下c:programfilesmicros

SQL Server 2005 数据库转 SQL Server 2000的方法小结_MsSql

今天有朋友推荐个活就是把Sql Server 2005的数据库转到Sql Server 2000里,但实际操作起来遇到的问题还不少,网上搜了一些办法,在此陈列出来,并把我使用时遇到的问题及解决方案一并记录下来,以备后期查阅 前几步和网上说的一样,先生成2000的脚本,然后再到2000里面执行.操作如下: 打开 SQL Server 2005 的Manger Studio -- 打开"对象资源管理器"(没有的话按F8), 连接到你的实例 找到你要转换的数据库(建议先将此数据库里的登录名清

&amp;amp;lt;求教&amp;amp;gt;关于.sql脚本文件如何生成数据库的问题

问题描述 <求教>关于.sql脚本文件如何生成数据库的问题 我使用powerdesigner导出oracle 11g数据库的.sql脚本文件,然后在SQL Plus中执行.sql脚本文件,报出许多错误,包括表名无效,表或视图不存在,指定的索引不存在,在网上找到一些类似的问题,都没能解决,请问有大神知道该如何解决么? 解决方案 我没有用过PowerDesigner生成的脚本.不过一般来说,你从系统生成的脚本,前面有若干DROP的,都是防御性的,是怕你现在生成的库中有相同名称的对象,所以预先帮你把

java-操作数据库的.exe程序,可以批量执行sql脚本文件

问题描述 操作数据库的.exe程序,可以批量执行sql脚本文件 求大神帮忙啊~用java可以做这个东西吗?完全没有思路啊,要求是可以操作局域网内的另一台电脑上的mysql数据库 解决方案 如果有访问权限的话,直接运行Runtime.getRuntime().exec("远程IP文件路径exe文件");如果没有,那可以先用java进行telnet连接到那台机器,然后调用exe程序,再不行就只能在远程机器上写webservice服务然后调用了. 解决方案二: 批量执行SQL脚本 解决方案三

SQL 合并多行记录的方法总汇_MsSql

SQL中合并多行记录的方法总汇: --1. 创建表,添加测试数据 CREATE TABLE tb(id int, [value] varchar(10)) INSERT tb SELECT 1, 'aa' UNION ALL SELECT 1, 'bb' UNION ALL SELECT 2, 'aaa' UNION ALL SELECT 2, 'bbb' UNION ALL SELECT 2, 'ccc' --SELECT * FROM tb /**//* id value ---------

Linux系统下将多个文件内容合并为一个文件的方法

  现在的工作最重视的是什么?当然是工作能力和工作效率,很多使用Linux系统的小伙伴们都遇到同意一个问题,想要导入数据库的时候,如果一个文件一个文件的导入的话,进程很慢,拖延时间,从而降低了工作效率.所以想找到一个新方法,可以将多个文件合成一个,这样不仅导入方便,而且速度也快,似乎是个不错的方法呢!下面小编就教大家Linux系统中如何将多个文件合成为一个,希望对大家有用! 在iDB Cloud 中发现导出的数据库文件是按照每个表生成的SQL文件,这么多单独的文件再导入到其他数据库中是个麻烦事,

如何解决win7系统打开txt文件提示“无法找到脚本文件”的方法

  我们使用win7系统的用户大家都会使用很多的办公软件,其中txt是一款非常常用的一款文本格式,使用起来也非常的方便,TXT大家主要是用来保存文本用的,可以直接打开就可以查看内容,也可以从浏览器中打开查看,但是有用户说自己在打开文件的时候出现了错误提示"无法找到脚本文件"的情况,要是大家的电脑出现了这样的情况该怎么办呢,小编马上就给大家分享解决方法. 出现TXT文件"无法找到脚本文件"的解决方法: 1.我们需要对自己的电脑进行深度的修复,跟着小编一起来更改一下软件

Win7中打开txt文件显示“无法找到脚本文件”解决方法

  首先,咱们分析一下故障出现的原因,一般情况下,咱们在双击打开txt文件之后,win7旗舰版电脑却弹出了"无法找到脚本文件"的提示,这可能是因为电脑中毒的原因引起的,而咱们杀毒之后,导致txt文件无法打开.具体解决方法如下: 1.也就是说,咱们杀毒之后,虽然该软件在win旗舰版中显示的还是记事本的图标,但是具体打开的时候,该程序却并非是以记事本的方式打开的,咱们只需要更改一下程序打开的方式就可以了. 2.首先,咱们在win7旗舰版中找到该txt文件,然后右键点击,选择默认打开方式,之