[回馈CSDN网友]贴个SQL小工具--移动数据库物理文件
已经适用大多数情况(SQLServer2005/2008):
USE masterGODECLARE @DBName sysname, @DestPath varchar(256)DECLARE @DB table( name sysname, physical_name sysname) BEGIN TRYSELECT @DBName = 'FF', --input database name @DestPath = 'E:\' --input destination path--kill database processesDECLARE @SPID varchar(20)DECLARE curProcess CURSOR FORSELECT spid FROM sys.sysprocessesWHERE DB_NAME(dbid) = @DBNameOPEN curProcess FETCH NEXT FROM curProcess INTO @SPID WHILE @@FETCH_STATUS = 0 BEGIN EXEC('KILL ' + @SPID) FETCH NEXT FROM curProcess ENDCLOSE curProcessDEALLOCATE curProcess--query physical nameINSERT @DB( name, physical_name)SELECT A.name, A.physical_nameFROM sys.master_files AINNER JOIN sys.databases B ON A.database_id = B.database_id AND B.name = @DBNameWHERE A.type <=1--set offlineEXEC('ALTER DATABASE ' + @DBName + ' SET OFFLINE')--move to dest pathDECLARE @login_name sysname, @physical_name sysname, @temp_name varchar(256)DECLARE curMove CURSOR FORSELECT name, physical_nameFROM @DBOPEN curMove FETCH NEXT FROM curMove INTO @login_name,@physical_name WHILE @@FETCH_STATUS = 0 BEGIN SET @temp_name = RIGHT(@physical_name,CHARINDEX('\',REVERSE(@physical_name)) - 1) EXEC('exec xp_cmdshell ''move "' + @physical_name + '" "' + @DestPath + '"''') EXEC('ALTER DATABASE ' + @DBName + ' MODIFY FILE ( NAME = ' + @login_name + ', FILENAME = ''' + @DestPath + @temp_name + ''')') FETCH NEXT FROM curMove INTO @login_name,@physical_name ENDCLOSE curMoveDEALLOCATE curMove--set onlineEXEC('ALTER DATABASE ' + @DBName + ' SET ONLINE')--show resultSELECT A.name, A.physical_nameFROM sys.master_files AINNER JOIN sys.databases B ON A.database_id = B.database_id AND B.name = @DBNameEND TRYBEGIN CATCH SELECT ERROR_MESSAGE() AS ErrorMessageEND CATCHsp_configure 'show advanced options',1reconfiguregosp_configure 'xp_cmdshell',1reconfiguregosp_configure 'show advanced options',0reconfiguregoUSE masterGODECLARE @DBName sysname, @DestPath varchar(256)DECLARE @DB table( name sysname, physical_name sysname) BEGIN TRYSELECT @DBName = 'TMP_DB', --input database name @DestPath = 'd:\A-' --input destination path--kill database processesDECLARE @SPID varchar(20)DECLARE curProcess CURSOR FORSELECT spid FROM sys.sysprocessesWHERE DB_NAME(dbid) = @DBNameOPEN curProcess FETCH NEXT FROM curProcess INTO @SPID WHILE @@FETCH_STATUS = 0 BEGIN EXEC('KILL ' + @SPID) FETCH NEXT FROM curProcess ENDCLOSE curProcessDEALLOCATE curProcess--query physical nameINSERT @DB( name, physical_name)SELECT A.name, A.physical_nameFROM sys.master_files AINNER JOIN sys.databases B ON A.database_id = B.database_id AND B.name = @DBNameWHERE A.type <=1--set offlineEXEC('ALTER DATABASE ' + @DBName + ' SET OFFLINE')--move to dest pathDECLARE @login_name sysname, @physical_name sysname, @temp_name varchar(256)DECLARE curMove CURSOR FORSELECT name, physical_nameFROM @DBOPEN curMove FETCH NEXT FROM curMove INTO @login_name,@physical_name WHILE @@FETCH_STATUS = 0 BEGIN SET @temp_name = RIGHT(@physical_name,CHARINDEX('\',REVERSE(@physical_name)) - 1) EXEC('exec xp_cmdshell ''move "' + @physical_name + '" "' + @DestPath + '"''') EXEC('ALTER DATABASE ' + @DBName + ' MODIFY FILE ( NAME = ' + @login_name + ', FILENAME = ''' + @DestPath + @temp_name + ''')') FETCH NEXT FROM curMove INTO @login_name,@physical_name ENDCLOSE curMoveDEALLOCATE curMove--set onlineEXEC('ALTER DATABASE ' + @DBName + ' SET ONLINE')--show resultSELECT A.name, A.physical_nameFROM sys.master_files AINNER JOIN sys.databases B ON A.database_id = B.database_id AND B.name = @DBNameEND TRYBEGIN CATCH SELECT ERROR_MESSAGE() AS ErrorMessageEND CATCH
[解决办法]
[解决办法]
收藏!
[解决办法]
好东东
[解决办法]