sqlserver数据库移动数据库路径的脚本示例

 更新时间:2013年12月05日 09:24:14   作者:  
前段时间做过这么一件事情,把原本放在c盘的所有数据库(除了sql server系统文件外)文件Move到D盘,主要是为了方便后续管理以及减少磁盘I/O阻塞(C,D是2个独立磁盘)。脚本需输入2个参数:目标数据库名字和目标目录

复制代码 代码如下:

USE master
GO

DECLARE
    @DBName sysname,
    @DestPath varchar(256)
DECLARE @DB table(
    name sysname,
    physical_name sysname)


BEGIN TRY

SELECT
    @DBName = 'TargetDatabaseName',   --input database name
    @DestPath = 'D:\SqlData\'         --input destination path


-- kill database processes
DECLARE @SPID varchar(20)
DECLARE curProcess CURSOR FOR

SELECT spid
FROM sys.sysprocesses
WHERE DB_NAME(dbid) = @DBName

OPEN curProcess
    FETCH NEXT FROM curProcess INTO @SPID
    WHILE @@FETCH_STATUS = 0
    BEGIN
            EXEC('KILL ' + @SPID)
            FETCH NEXT FROM curProcess
    END
CLOSE curProcess
DEALLOCATE curProcess

-- query physical name
INSERT @DB(
    name,
    physical_name)
SELECT
    A.name,
    A.physical_name
FROM sys.master_files A
INNER JOIN sys.databases B
    ON A.database_id = B.database_id
        AND B.name = @DBName
WHERE A.type <=1

--set offline
EXEC('ALTER DATABASE ' + @DBName + ' SET OFFLINE')

--move to dest path
DECLARE
    @login_name sysname,
    @physical_name sysname,
    @temp_name varchar(256)
DECLARE curMove CURSOR FOR
SELECT
    name,
    physical_name
FROM @DB
OPEN 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
        END
CLOSE curMove
DEALLOCATE curMove

-- set online
EXEC('ALTER DATABASE ' + @DBName + ' SET ONLINE')

-- show result
SELECT
    A.name,
    A.physical_name
FROM sys.master_files A
INNER JOIN sys.databases B
    ON A.database_id = B.database_id
        AND B.name = @DBName
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE() AS ErrorMessage
END CATCH
GO

相关文章

  • Ubuntu 14.04下mysql安装配置教程

    Ubuntu 14.04下mysql安装配置教程

    这篇文章主要以图文结合的方式为大家分享了Ubuntu 14.04下mysql安装配置教程,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • SQLSERVER收集语句运行的统计信息并进行分析

    SQLSERVER收集语句运行的统计信息并进行分析

    例如语句的编译时间、执行时间、做了多少次磁盘读等,如果DBA能够把问题语句单独测试运行,可以在运行前打开下面这三个开关,收集语句运行的统计信息。这些信息对分析问题很有价值,感兴趣的朋友可以了解下
    2013-01-01
  • SQLServer行列互转实现思路(聚合函数)

    SQLServer行列互转实现思路(聚合函数)

    这篇文章主要为大家详细介绍了SQLServer行列互转实现思路,使用聚合函数pivot/unpivot实现行列互转,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • 修复断电等损坏的SQL 数据库

    修复断电等损坏的SQL 数据库

    修复断电等损坏的SQL 数据库,不论因为哪种原因,大家都可以测试下,试试。
    2009-08-08
  • SQLServer常见数学函数梳理总结

    SQLServer常见数学函数梳理总结

    这篇文章主要为大家介绍了SQLServer常见数学函数梳理总结分享,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • sql server查询语句阻塞优化性能

    sql server查询语句阻塞优化性能

    这篇文章介绍了sql server查询语句阻塞优化性能的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • sql server实现递归查询的方法示例

    sql server实现递归查询的方法示例

    这篇文章主要介绍了sql server实现递归查询的方法,结合具体实例形式分析了SQL Server递归查询的原理与实现技巧,需要的朋友可以参考下
    2017-03-03
  • oracle学习笔记(二)

    oracle学习笔记(二)

    最近需要用的oracle,所以大家好好的学习下基础并整理下资料,希望能帮助到需要的朋友。
    2011-12-12
  • SQL Server中的XML数据类型详解

    SQL Server中的XML数据类型详解

    本文详细讲解了SQL Server中的XML数据类型,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 最常用的SQL语句

    最常用的SQL语句

    最常用的SQL语句,大家可以看下,都是在开发过程中,比较常用的语句。
    2009-10-10

最新评论