批量执行某文件夹下所有SQL

    技术2022-05-11  63

    首先感谢上的网友,在你们的帮助下我才能有韧有余地处理了N多有难度的东西。

    特别地感谢邹建,他热心的帮忙和他经典的书。

    /*-------------------------------批量执行sql脚本--批量执行文件夹下面的所有sql脚本--yangys 2005/07/04*/create procedure exeSqlFileBatch( @returnCode int=0 output, --返回错误数 @returnSucceed int=0 output, --成功执行文件数量 @serverName varchar(1000), --服务器名称 @dataBase   varchar(500), --数据库名称 @uid     varchar(50), --用户名 @pwd        varchar(50), --密码 @filePath varchar(5000)  --文件路径)with encryption as declare @strsql varchar(6000)set @strsql=' dir '+@filePath+'/*.sql'

    --创建临时表create table #tmptb(fileDes varchar(5000))--将文件夹信息插入临时表insert into #tmptbexec master.dbo.xp_cmdshell @strsql

    if @@error <>0 begin  set @returnCode=1 return @returnCodeend

    --从临时表中提取有用的记录select dbo.f_split(fileDes,' ')as fileDesinto #tmepUse from #tmptbwhere fileDes like '%.sql'

    --定义游标declare  fetFileName cursorfor select fileDes from #tmepUse

    declare @strFileName varchar(2000)declare @reExe int

    --定义错误信息表create table #errorTable(errorFileName varchar(1000))

    --打开游标并历遍进行取值open fetFileNamefetch next from fetFileName into @strFileNamewhile @@FETCH_STATUS = 0begin   --执行该数据脚本文件 set @strsql='osql -S '+@serverName      +' -U '+@uid +' -P '+@pwd +' -d '+@dataBase +' -i '      +@filePath +'/'+@strFileName exec @reExe=master.dbo.xp_cmdShell @strsql --统计执行错误数执行成功数 if @reExe=0   set @returnSucceed=@returnSucceed+1 else  begin   --没办法,xp_cmdShell 总返回零。可能无法获取osql所发生的错误   insert #errorTable values(@strFileName)   set @returnCode=@returnCode+1  end

     fetch next from fetFileName into @strFileNameend

    close fetFileNamedeallocate fetFileName

    --返回错误错误信息 select *from #errorTable

    return

     

    --测试declare @returnCode int declare @returnSucceed int set @returnCode=0set @returnSucceed=0exec exeSqlFileBatch @returnCode output,@returnSucceed output,'prg','yys','sa','','D:/ERP/Database/View'print @returnCodeprint @returnSucceed

    --测试前请先创建函数/*---------------------实现split功能 的函数--yangys 2005/07/04--只返回最后的一串*/create function f_split( @SourceSql varchar(8000),--字符串 @StrSeprate varchar(10)--分隔符)returns  varchar(1000)as begin    declare @i int    set @SourceSql=rtrim(ltrim(@SourceSql))    set @i=charindex(@StrSeprate,@SourceSql)    while @i>=1    begin        set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)        set @i=charindex(@StrSeprate,@SourceSql)    end    return @SourceSqlend

     

    最新回复(0)