改进后能够直接运行.sql文件的存储过程

忘记了是从哪里改动过来的了.^_^汗一个.引用请保留申明文字.如果大家有改进请email我.让我们一起进步.另外要注意的是exec只支持8000字符.呵呵.当初写这个存储过程纯粹为了练习SP的写法和深入了解SQL语法.如果有空我会写一个详细注释这个存储过程的文章.希望大家能从中学到新的技巧.

版权申明:NightAirs 2004-2005 NightAirs@126.com 
功能描述:
    从文件中运行SQL脚本,文件大小没有限制.但每行不能超过256个字节.
    基本上很危险,如果在文件中写危险的语句.或者重复调用该语句.

版本信息:
       V1.0.0.1 包含''go''不会导致错误.
       usp_SysExecTSQLFile
         @filepath varchar(256) = null
调用示例:
       exec usp_SysExecTSQLFile ''c:/1.sql''

***********************************************************************************************************

create proc usp_SysExecTSQLFile
       @filepath varchar(256) = null
--with encryption
as
begin
 if @filepath is null
 begin
  print '
引用请保留以下申明:
***********************************************************  
版权申明:NightAirs 2004-2005 NightAirs@126.com 
功能描述:
    从文件中运行SQL脚本,文件大小没有限制.但每行不能超过256个字节.
    基本上很危险,如果在文件中写危险的语句.或者重复调用该语句.
版本信息:
       V1.0.0.1 包含''go''不会导致错误.
       usp_SysExecTSQLFile
         @filepath varchar(256) = null
调用示例:
       exec usp_SysExecTSQLFile ''c:/1.sql''
***********************************************************'
      
  return
 end
 set nocount on
 -- create a temp holding table.
 If (Select object_id('tempstrfile')) > 0
    drop table tempstrfile
 create table tempstrfile(id int identity(1,1) not null,
    script varchar(256) null,
    datalengths int DEFAULT (0))
 set @filepath = 'type "' + @filepath + '"' -- 加上""可以支持带空格的文件名.文件行最大只能是256.
 insert into tempstrfile(script)
  exec master.dbo.xp_cmdshell @filepath
 update tempstrfile set script = ltrim(rtrim(script))
 update tempstrfile set datalengths = datalength(script)
 delete from tempstrfile where datalengths is null or datalengths = 0
 
 declare @l_icharcounts int,@l_istrcounts int
 select @l_icharcounts = isnull(sum(datalengths),0),@l_istrcounts=(@l_icharcounts + 7999)/8000 from tempstrfile
 if @l_icharcounts = 0
 begin
  print '文件中未包含任何内容.'
  return -101
 end
 declare @l_ssqlDeclare varchar(4000),@l_ssqlWhile varchar(4000),@l_ssqlExec varchar(4000),@l_ssqlSet varchar(4000),@l_iCount int
 select @l_iCount = 0 ,@l_ssqlExec = '@strpre', @l_ssqlWhile = '',@l_ssqlSet = 'select @strline = ''''',
 @l_ssqlDeclare =
 'set nocount on
 declare @cnt int,@loop int
 declare @strpre varchar(1)
 set @strpre = ''''
 declare @strline varchar(256)' + char(10)
  
 while @l_iCount < @l_istrcounts
    begin
  set @l_ssqlDeclare = @l_ssqlDeclare
  + ', @str' + convert(varchar(10),@l_iCount) + ' varchar(8000)' + char(10)
  set @l_ssqlSet = @l_ssqlSet + ', @str' + convert(varchar(10),@l_iCount) + ' = ''''' + char(10)
  set @l_ssqlWhile =
   case @l_iCount
    when 0 then 'If datalength(@str0) < 7744 ' + char(10)
    else ' If datalength(@str' + convert(varchar(10),@l_iCount - 1) + ') >= 7744 and datalength(@str' + convert(varchar(10),@l_iCount) + ') < 7744 ' + char(10)
   end
         + ' set @str' + convert(varchar(10),@l_iCount) + ' = @str' + convert(varchar(10),@l_iCount) + ' + @strline ' + char(10)
   + @l_ssqlWhile
  set @l_ssqlExec = @l_ssqlExec + '+@str' + convert(varchar(10),@l_iCount)
  set @l_iCount = @l_iCount + 1
 end
  
  set @l_ssqlDeclare = @l_ssqlDeclare + char(10) + @l_ssqlSet + char(10) +
 'select @loop = min(id),@cnt = max(id) from tempstrfile 
  While @loop <= @cnt
     Begin
        select @strline = script from tempstrfile where id = @loop
        if upper(@strline) = ''GO''
        begin
          exec (' + @l_ssqlExec + ') ' +char(10)
     + @l_ssqlSet + '
        end
        else
     begin
          set @strline = @strline + char(13) + char(10) ' + char(10)
  + @l_ssqlWhile + char(10)
  + 'end
  Select @loop = min(id) from tempstrfile where id > @loop
     End
 exec (' + @l_ssqlExec + ')'
 --print @l_ssqlDeclare
 exec (@l_ssqlDeclare)
 Drop table tempstrfile
end
go

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值