忘记了是从哪里改动过来的了.^_^汗一个.引用请保留申明文字.如果大家有改进请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