你應該是用了追加模式的備份,看看:*--备份数据库 zjcxc(邹建)
/*--调用示例--备份当前数据库
EXEC procBackupDB @byvBkPath='c:\',@byvBkFileName='\DBNAME\_\DATE\_db.bak'--差异备份当前数据库
EXEC procBackupDB @byvBkPath='c:\',@byvBkFileName='db_\DATE\_df.bak',@byvBkType='DF'--备份当前数据库日志
EXEC procBackupDB @byvBkPath='c:\',@byvBkFileName='db_\DATE\_log.bak',@byvBkType='LOG'--*/IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[procBackupDB]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE [dbo].[procBackupDB]
GOCREATE PROC procBackupDB
@byvDbName sysname='', --要备份的数据库名称,不指定则备份当前数据库
@byvBkPath nvarchar(260)='', --备份文件的存放目录,不指定则使用SQL默认的备份目录
@byvBkFileName nvarchar(260)='', --文件名,可用\DBNAME\表数据库,\DATE\表日期,\TIME\表时间
@byvBkType nvarchar(10)='DB', --备份类型:'DB'备份数据库,'DF' 差异备份,'LOG' 日志备份
@byvBkSign bit=1 --追加/覆盖备份文件
AS
DECLARE @vchSql varchar(8000)
IF ISNULL(@byvDbName,'')='' SET @byvDbName=db_name()IF ISNULL(@byvBkPath,'')='' BEGIN
SELECT @byvBkPath=RTRIM(REVERSE(filename)) FROM master..sysfiles WHERE name='master'
SELECT @byvBkPath=SUBSTRING(@byvBkPath,CHARINDEX('\',@byvBkPath)+1,4000)
,@byvBkPath=REVERSE(SUBSTRING(@byvBkPath,CHARINDEX('\',@byvBkPath),4000))+'BACKUP\'
END
IF ISNULL(@byvBkFileName,'')='' SET @byvBkFileName='\DBNAME\_\DATE\_\TIME\.BAK'SET @byvBkFileName=REPLACE(REPLACE(REPLACE(@byvBkFileName,'\DBNAME\',@byvDbName)
,'\DATE\',CONVERT(varchar,GETDATE(),112))
,'\TIME\',REPLACE(CONVERT(varchar,GETDATE(),108),':',''))SET @vchSql='backup '+CASE @byvBkType WHEN 'LOG' THEN 'log ' ELSE 'database ' END +@byvDbName
+' to disk='''+@byvBkPath+@byvBkFileName
+''' with '+CASE @byvBkType WHEN 'DF' THEN 'DIFFERENTIAL,' ELSE '' END
+CASE @byvBkSign WHEN 1 THEN 'NOINIT' ELSE 'INIT' ENDEXEC(@vchSql)GO
/*--调用示例--备份当前数据库
EXEC procBackupDB @byvBkPath='c:\',@byvBkFileName='\DBNAME\_\DATE\_db.bak'--差异备份当前数据库
EXEC procBackupDB @byvBkPath='c:\',@byvBkFileName='db_\DATE\_df.bak',@byvBkType='DF'--备份当前数据库日志
EXEC procBackupDB @byvBkPath='c:\',@byvBkFileName='db_\DATE\_log.bak',@byvBkType='LOG'--*/IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[procBackupDB]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE [dbo].[procBackupDB]
GOCREATE PROC procBackupDB
@byvDbName sysname='', --要备份的数据库名称,不指定则备份当前数据库
@byvBkPath nvarchar(260)='', --备份文件的存放目录,不指定则使用SQL默认的备份目录
@byvBkFileName nvarchar(260)='', --文件名,可用\DBNAME\表数据库,\DATE\表日期,\TIME\表时间
@byvBkType nvarchar(10)='DB', --备份类型:'DB'备份数据库,'DF' 差异备份,'LOG' 日志备份
@byvBkSign bit=1 --追加/覆盖备份文件
AS
DECLARE @vchSql varchar(8000)
IF ISNULL(@byvDbName,'')='' SET @byvDbName=db_name()IF ISNULL(@byvBkPath,'')='' BEGIN
SELECT @byvBkPath=RTRIM(REVERSE(filename)) FROM master..sysfiles WHERE name='master'
SELECT @byvBkPath=SUBSTRING(@byvBkPath,CHARINDEX('\',@byvBkPath)+1,4000)
,@byvBkPath=REVERSE(SUBSTRING(@byvBkPath,CHARINDEX('\',@byvBkPath),4000))+'BACKUP\'
END
IF ISNULL(@byvBkFileName,'')='' SET @byvBkFileName='\DBNAME\_\DATE\_\TIME\.BAK'SET @byvBkFileName=REPLACE(REPLACE(REPLACE(@byvBkFileName,'\DBNAME\',@byvDbName)
,'\DATE\',CONVERT(varchar,GETDATE(),112))
,'\TIME\',REPLACE(CONVERT(varchar,GETDATE(),108),':',''))SET @vchSql='backup '+CASE @byvBkType WHEN 'LOG' THEN 'log ' ELSE 'database ' END +@byvDbName
+' to disk='''+@byvBkPath+@byvBkFileName
+''' with '+CASE @byvBkType WHEN 'DF' THEN 'DIFFERENTIAL,' ELSE '' END
+CASE @byvBkSign WHEN 1 THEN 'NOINIT' ELSE 'INIT' ENDEXEC(@vchSql)GO
解决方案 »
- 求各位大大指教一sql
- |zyciis| 晕 我SQL白痴,又记了怎么限定UserName表不能出现相同,谢谢 第二贴
- 怎样查找一列中没有包含某个字段的数据
- 在存储过程里有办法取到update这条记录的被更新的这个字段的值吗?
- windows xp 下sql 2000 做分布式数据更新
- 错在哪里呢?(刚学存储过程,错误百出,问题多多)
- select语句出错!!!
- SQL数据库挂掉出现疑难,高手帮忙下啊!!谢谢
- 如何与内部网的Sql Server2000建立连接
- 怎样才能不让别人删除我的数据库?
- 急:表A中有一个字段是 mycode char (4),现在我想将它改成 mycode char (20),sql 语句怎么写?"
- 一个很急的问题,绉兄,帮我看看!
zjcxc(邹建) /*--调用示例
--完整恢复数据库
EXEC procRestoreDb @byvBkFile='c:\db_20031015_db.bak',@byvBbName='db'--差异备份恢复
EXEC procRestoreDb @byvBkFile='c:\db_20031015_db.bak',@byvBbName='db',@byvType='DBNOR'
EXEC p_backupdb @byvBkFile='c:\db_20031015_df.bak',@byvBbName='db',@byvType='DF'--日志备份恢复
EXEC procRestoreDb @byvBkFile='c:\db_20031015_db.bak',@byvBbName='db',@byvType='DBNOR'
EXEC p_backupdb @byvBkFile='c:\db_20031015_log.bak',@byvBbName='db',@byvType='LOG'--*/IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[procRestoreDb]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROC [dbo].[procRestoreDb]
GOCREATE PROC procRestoreDb
@byvBkFile nvarchar(1000), --定义要恢复的备份文件名
@byvBbName sysname='', --定义恢复后的数据库名,默认为备份的文件名
@byvBbPath nvarchar(260)='', --恢复后的数据库存放目录,不指定则为SQL的默认数据目录
@byvType nvarchar(10)='DB', --恢复类型:'DB'完整,'DBNOR' 为差异,日志恢复进行完整恢复, DF' 差异备份的恢复,'LOG' 日志恢复
@byvFileNo int=1, --恢复的文件号
@byvOverSign bit=1, --是否覆盖已经存在的数据库,仅@byvType为'DB'/'DBNOR'是有效
@byvKillSign bit=1 --是否关闭用户使用进程,仅@byvOverSign=1时有效
AS
DECLARE @vchSql varchar(8000)--得到恢复后的数据库名
IF ISNULL(@byvBbName,'')=''
SELECT @vchSql=REVERSE(@byvBkFile)
,@vchSql= CASE WHEN CHARINDEX('.',@vchSql)=0 THEN @vchSql
ELSE SUBSTRING(@vchSql,CHARINDEX('.',@vchSql)+1,1000) END
,@vchSql= CASE WHEN CHARINDEX('\',@vchSql)=0 THEN @vchSql
ELSE LEFT(@vchSql,CHARINDEX('\',@vchSql)-1) END
,@byvBbName=REVERSE(@vchSql)--得到恢复后的数据库存放目录
IF ISNULL(@byvBbPath,'')=''
BEGIN
SELECT @byvBbPath=rtrim(REVERSE(filename)) FROM master..sysfiles WHERE name='master'
SELECT @byvBbPath=REVERSE(substring(@byvBbPath,charindex('\',@byvBbPath),4000))
END--生成数据库恢复语句
SET @vchSql='restore '+ CASE @byvType WHEN 'LOG' THEN 'log ' ELSE 'database ' END+@byvBbName
+' FROM disk='''+@byvBkFile+''''
+' with file='+CAST(@byvFileNo as varchar)
+ CASE WHEN @byvOverSign=1 AND @byvType in('DB','DBNOR') THEN ',replace' ELSE '' END
+ CASE @byvType WHEN 'DBNOR' THEN ',NORECOVERY' ELSE ',RECOVERY' END--添加移动逻辑文件的处理
IF @byvType='DB' or @byvType='DBNOR'
BEGIN
--从备份文件中获取逻辑文件名
DECLARE @lfn nvarchar(128),@tp char(1),@i int--创建临时表,保存获取的信息
CREATE TABLE #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0))
--从备份文件中获取信息
INSERT INTO #tb EXEC('restore filelistonly FROM disk='''+@byvBkFile+'''')
DECLARE #f CURSOR FOR SELECT ln,tp FROM #tb
OPEN #f
FETCH NEXT FROM #f INTO @lfn,@tp
SET @i=0
WHILE @@FETCH_STATUS=0
BEGIN
SELECT @vchSql=@vchSql+',move '''+@lfn+''' to '''+@byvBbPath+@byvBbName+CAST(@i as varchar)
+ CASE @tp WHEN 'D' THEN '.mdf''' ELSE '.ldf''' END
,@i=@i+1
FETCH NEXT FROM #f into @lfn,@tp
END
CLOSE #f
DEALLOCATE #f
END--关闭用户进程处理
IF @byvOverSign=1 AND @byvKillSign=1
BEGIN
DECLARE @spid varchar(20)
DECLARE #spid cursor for
SELECT spid=cast(spid as varchar(20)) FROM master..sysprocesses WHERE dbid=db_id(@byvBbName)
OPEN #spid
FETCH NEXT FROM #spid into @spid
WHILE @@FETCH_STATUS=0
BEGIN
EXEC('kill '+@spid)
FETCH NEXT FROM #spid into @spid
END
CLOSE #spid
DEALLOCATE #spid
END--恢复数据库
EXEC(@vchSql)GO
你的解决方法我也收藏了.虽然现在还用不到(我现在主要是ASP,SQL只是在做数据存储),等我深入学习SQL的时候就用到了哦...再次谢谢二位....