批量执行SQL脚本

1.先要 xp_cmdshell 这个东东给打开,打开方法如下:

sp_configure 'show advanced options',1
reconfigure
go
sp_configure 'xp_cmdshell',1
reconfigure
go

测试就这样 exec master.dbo.xp_cmdshell 'dir d:\'

2.我们做一个分隔函数,如下:

ALTER FUNCTION  [dbo].[f_split]
(
     @SourceSql VARCHAR(MAX),--字符串
     @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 @SourceSql
END

测试 :

SourceSql='2017-09-28    123.sql'
StrSeprate =' '  是空格不是空 

返回:123.sql

3.CREATE PROC 来执行操作

ALTER PROCEDURE [dbo].[Usp_BatchImport]
 (
 @returnCode INT=0 OUTPUT, --返回错误数
 @returnSucceed INT=0 OUTPUT, --成功执行文件数量
 @serverName VARCHAR(1000), --服务器名称
 @dataBase   VARCHAR(500), --数据库名称
 @uid     VARCHAR(50), --用户名
 @pwd        VARCHAR(50), --密码
 @filePath VARCHAR(5000)  --文件路径
 )
AS
BEGIN
DECLARE @strsql VARCHAR(2000)
SET @strsql=' dir '+@filePath+'\*.sql'
--把读到的文件名导到临时表中
CREATE TABLE #tmptb(fileDes VARCHAR(5000))
INSERT INTO #tmptb
EXEC master.dbo.xp_cmdshell  @strsql
--有木有错误
IF(@@ERROR<>0)
BEGIN
    SET @returnCode=1
    RETURN @returnCode
END
--把分隔后的文件名放在另外一个表中,带有.sql的文件
SELECT dbo.f_split(fileDes,' ') AS fileDes
INTO #tmepUSE FROM #tmptb WHERE fileDes LIKE '%.sql'

DECLARE @strFileName VARCHAR(2000)
DECLARE @REEXE INT

--声明一个游标同时从#tmepUSE中给游标赋值
DECLARE FETFILENAME CURSOR FOR SELECT fileDes FROM #tmepUSE
OPEN FETFILENAME FETCH 
NEXT FROM FETFILENAME INTO @strFileName

WHILE @@FETCH_STATUS=0
BEGIN
    --此句比较关键 
    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
        SELECT @strFileName
        SET @returnCode=@returnCode+1
    END
    FETCH NEXT FROM FETFILENAME INTO @strFileName
END
CLOSE FETFILENAME
DEALLOCATE FETFILENAME  
END

测试:

declare @returnCode int 
declare @returnSucceed int 
set @returnCode=0
set @returnSucceed=0
--这是我自己的测试环境
exec [Usp_BatchImport] @returnCode output,@returnSucceed output,'WIN7-1706042132','TEMP','sa','123456','D:\SQL'
print @returnCode
print @returnSucceed
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值