存储过程如下:

USE [SCC_Test_FileGroupAndIndex]
GO
/****** Object:  StoredProcedure [dbo].[sp_MoveTable]    Script Date: 2015/3/5 11:16:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*移动表数据到别的文件组 2008-12-29*/
ALTER PROC [dbo].[sp_MoveTable]
    (
      @objectname sysname ,
      @NewFileGroup sysname = NULL
    )
AS
    SET NOCOUNT ON
    DECLARE @objectid INT

    SELECT  @objectid = object_id ,
            @objectname = name
    FROM    sys.objects AS a
    WHERE   name = @objectname
            AND Type = 'U'
            AND is_ms_shipped = 0
            AND NOT EXISTS ( SELECT 1
                             FROM   sys.extended_properties
                             WHERE  major_id = a.object_id
                                    AND minor_id = 0
                                    AND class = 1
                                    AND name = N'microsoft_database_tools_support' )
    IF @objectid IS NULL
        BEGIN
            --RAISERROR 50001 N'无效的表名!'
            RAISERROR (N'无效的表名', -- Message text.
           10,           -- Severity,
           1            -- State,
          );    -- First argument supplies the string.
            RETURN
        END

    IF FILEGROUP_ID(@NewFileGroup) IS NULL
        AND @NewFileGroup > ''
        BEGIN
           -- RAISERROR 50001 N'错误的文件组!'
            RAISERROR (N'错误的文件组', -- Message text.
           10,           -- Severity,
           2            -- State,
         );    -- First argument supplies the string.
            RETURN
        END

    IF @NewFileGroup IS NULL
        SELECT  @NewFileGroup = name
        FROM    sys.filegroups
        WHERE   is_default = 1

    IF EXISTS ( SELECT  1
                FROM    sys.indexes AS a
                        INNER JOIN sys.filegroups AS b ON b.data_space_id = a.data_space_id
                WHERE   a.object_id = @objectid
                        AND b.name = @NewFileGroup
                        AND ( a.type = 0
                              OR is_primary_key = 1
                            ) )
        BEGIN
            PRINT N'表' + @objectname + N'已在文件组' + @NewFileGroup + N' .不需要移动! '
            RETURN
        END

    DECLARE @sql NVARCHAR(4000) ,
        @Enter NVARCHAR(20) ,
        @PrimaryKey sysname

    SELECT  @sql = '' ,
            @Enter = CHAR(13) + CHAR(10)

--删除主键、外键、索引
    SELECT  @sql = @sql + 'Alter Table '
            + QUOTENAME(OBJECT_NAME(a.parent_object_id)) + ' Drop Constraint '
            + QUOTENAME(a.name) + @Enter
    FROM    sys.Foreign_keys AS a
    WHERE   a.referenced_object_id = @objectid

    SELECT  @sql = @sql
            + CASE WHEN b.object_id IS NOT NULL
                   THEN 'Alter Table ' + QUOTENAME(@objectname)
                        + ' Drop Constraint ' + QUOTENAME(a.name)
                        + CASE b.Type
                            WHEN 'PK'
                            THEN ' With (Move To ' + QUOTENAME(@NewFileGroup)
                                 + ')'
                            ELSE ''
                          END
                   ELSE 'Drop Index ' + QUOTENAME(a.name) + '.'
                        + QUOTENAME(@objectname)
              END + @Enter
    FROM    sys.indexes AS a
            LEFT OUTER JOIN sys.objects AS b ON b.parent_object_id = a.object_id
                                                AND b.Type IN ( 'PK', 'UQ' )
                                                AND b.name = a.name
    WHERE   a.object_id = @objectid
            AND a.name IS NOT NULL

    IF NOT EXISTS ( SELECT  *
                    FROM    sys.indexes
                    WHERE   object_id = @objectid
                            AND is_primary_key = 1 )
        BEGIN
            SET @PrimaryKey = 'ID' + REPLACE(NEWID(), '-', '')
--创建主键(在表没有主键的情况)
            SET @sql = @sql + 'Alter Table ' + QUOTENAME(@objectname)
                + ' Add ' + @PrimaryKey
                + ' uniqueidentifier Not Null ,Constraint DF_' + @objectname
                + '_' + @PrimaryKey + ' Default(newid()) For ' + @PrimaryKey
                + '' + ',Constraint PK_' + @objectname + '_' + @PrimaryKey
                + ' Primary Key (' + @PrimaryKey + ' Asc)' + @Enter
--删除主键
            SET @sql = @sql + 'Alter Table ' + QUOTENAME(@objectname)
                + ' Drop Constraint PK_' + @objectname + '_' + @PrimaryKey
                + ' With (Move To ' + QUOTENAME(@NewFileGroup) + ')' + @Enter
            SET @sql = @sql + 'Alter Table ' + QUOTENAME(@objectname)
                + ' Drop Constraint DF_' + @objectname + '_' + @PrimaryKey
                + @Enter
            SET @sql = @sql + 'Alter Table ' + QUOTENAME(@objectname)
                + ' Drop Column ' + @PrimaryKey + @Enter
        END

--创建主键、外键、索引
    SELECT  @sql = @sql
            + CASE WHEN b.object_id IS NOT NULL
                   THEN 'Alter Table ' + QUOTENAME(@objectname)
                        + ' Add Constraint ' + QUOTENAME(a.name)
                        + CASE a.is_primary_key
                            WHEN 1 THEN ' Primary Key '
                            ELSE 'Unique '
                          END + '(' + c.x + ')'
                   ELSE 'Create Index ' + CASE a.is_unique
                                            WHEN 1 THEN 'Unique '
                                            ELSE ''
                                          END + CASE a.type
                                                  WHEN 1 THEN 'Clustered '
                                                  ELSE ''
                                                END + QUOTENAME(a.name)
                        + ' On ' + QUOTENAME(@objectname) + '(' + c.x + ')'
                        + ISNULL(' Include(' + d.x + ')', '')
              END + @Enter
    FROM    sys.indexes AS a
            LEFT OUTER JOIN sys.objects AS b ON b.parent_object_id = a.object_id
                                                AND b.Type IN ( 'PK', 'UQ' )
                                                AND b.name = a.name
            OUTER APPLY ( SELECT    x = STUFF(( SELECT  ',' + QUOTENAME(y.name)
                                                        + CASE x.is_descending_key
                                                            WHEN 1
                                                            THEN ' Desc'
                                                            ELSE ' Asc'
                                                          END
                                                FROM    sys.index_columns AS x
                                                        INNER JOIN sys.columns
                                                        AS y ON y.object_id = x.object_id
                                                              AND x.column_id = y.column_id
                                                WHERE   x.object_id = a.object_id
                                                        AND x.index_id = a.index_id
                                                        AND x.is_included_column = 0
                                              FOR
                                                XML PATH('')
                                              ), 1, 1, '')
                        ) AS c
            OUTER APPLY ( SELECT    x = STUFF(( SELECT  ',' + QUOTENAME(y.name)
                                                FROM    sys.index_columns AS x
                                                        INNER JOIN sys.columns
                                                        AS y ON y.object_id = x.object_id
                                                              AND x.column_id = y.column_id
                                                WHERE   x.object_id = a.object_id
                                                        AND x.index_id = a.index_id
                                                        AND x.is_included_column = 1
                                              FOR
                                                XML PATH('')
                                              ), 1, 1, '')
                        ) AS d
    WHERE   a.object_id = @objectid
            AND a.name IS NOT NULL

    SELECT  @sql = @sql + 'Alter Table '
            + QUOTENAME(OBJECT_NAME(a.parent_object_id)) + ' Add Constraint '
            + QUOTENAME(a.name) + ' Foreign Key (' + b.x + ') References '
            + QUOTENAME(@objectname) + '(' + c.x + ')' + @Enter
    FROM    sys.Foreign_keys AS a
            OUTER APPLY ( SELECT    x = STUFF(( SELECT  ',' + QUOTENAME(y.name)
                                                FROM    sys.Foreign_key_columns
                                                        AS x
                                                        INNER JOIN sys.columns
                                                        AS y ON y.object_id = x.parent_object_id
                                                              AND y.column_id = x.parent_column_id
                                                WHERE   x.constraint_object_id = a.object_id
                                              FOR
                                                XML PATH('')
                                              ), 1, 1, '')
                        ) AS b
            OUTER APPLY ( SELECT    x = STUFF(( SELECT  ',' + QUOTENAME(y.name)
                                                FROM    sys.Foreign_key_columns
                                                        AS x
                                                        INNER JOIN sys.columns
                                                        AS y ON y.object_id = x.referenced_object_id
                                                              AND y.column_id = x.referenced_column_id
                                                WHERE   x.constraint_object_id = a.object_id
                                              FOR
                                                XML PATH('')
                                              ), 1, 1, '')
                        ) AS c
    WHERE   a.referenced_object_id = @objectid

--执行脚本
    BEGIN TRY
        BEGIN TRAN
        EXEC(@sql)
        COMMIT TRAN
        PRINT N'表' + @objectname + N'数据移动到到文件组' + @NewFileGroup + N' .成功! '
    END TRY
    BEGIN CATCH
        DECLARE @Error NVARCHAR(1024)
        SET @Error = ERROR_MESSAGE()
        --RAISERROR 50001 @Error
        RAISERROR (@Error, -- Message text.
                10, -- Severity.
                3 -- State.
               );
        PRINT N'表' + @objectname + N'数据移动到到文件组' + @NewFileGroup + N' .失败! ';
        PRINT N'报错语句:' + @sql;
        ROLLBACK TRAN
    END CATCH

 

 

使用示例:

EXEC sp_MoveTable TblStudents, 'StudentsFileGroup';

 

报错处理:

由于有时候执行删除索引移动表的时候会报错,报错的语句如下:

ALTER TABLE [TblStudents] DROP CONSTRAINT [PK_TblStudentsIndex] WITH (MOVE TO [Schedule]);
ALTER TABLE [TblStudents] ADD CONSTRAINT [PK_TblStudentsIndex] PRIMARY KEY ([OID] ASC);

 

可以改成如下语句运行:

ALTER TABLE [TblStudents] DROP CONSTRAINT [PK_TblStudentsIndex];
ALTER TABLE [TblStudents] ADD CONSTRAINT [PK_TblStudentsIndex] PRIMARY KEY ([OID] ASC);

ALTER TABLE [TblStudents] DROP CONSTRAINT [PK_TblStudentsIndex] WITH (MOVE TO [Schedule]);
ALTER TABLE [TblStudents] ADD CONSTRAINT [PK_TblStudentsIndex] PRIMARY KEY ([OID] ASC);

sql server 移动表到文件组的更多相关文章

  1. sql server迁移数据(文件组之间的互相迁移与 文件组内文件的互相迁移)

    转自:https://www.cnblogs.com/lyhabc/p/3504380.html?utm_source=tuicool SQLSERVER将数据移到另一个文件组之后清空文件组并删除文件 ...

  2. sql server 备份与恢复系列六 文件组备份与还原

    一. 概述 文件备份是指备份一个或多个文件或文件组中的所有数据.使用文件备份能够只还原损坏的文件,而不用还原数据库的其余部份,从而加快恢复速度.例如,如果数据库由位于不同磁盘上的若干文件组成,在其中一 ...

  3. 关于SQL Server中分区表的文件与文件组的删除(转)

    在SQL Server中对表进行分区管理时,必定涉及到文件与文件组,关于文件与文件组如何创建在网上资料很多,我博客里也有两篇相关转载文件,可以看看,我这就不再细述,这里主要讲几个一般网上很少讲到的东西 ...

  4. SQL Server 创建表分区

    原文:SQL Server 创建表分区 先准备测试表 CREATE TABLE [dbo].[Employee] ( EmployeeNo ,) PRIMARY KEY, EmployeeName ) ...

  5. Sql server 系统表

    sql server系统表详细说明 SQL Server 用户库中系统表说明 名称 说明 备注 syscolumns 每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行.   sys ...

  6. sql server系统表和视图相关的语句

    一.系统表 数据字典的详细信息请查SQL SERVER BOL,这里仅列出一部分. 1.1.sysservers 1.查看所有本地服务器及链接服务器 select * from master..sys ...

  7. SQL Server 2008 表分区的含义

    https://www.cnblogs.com/knowledgesea/p/3696912.html 继续看这个文档 http://www.360doc.com/content/16/0104/11 ...

  8. SQL Server系统表介绍与使用

    关于SQL Server数据库的一切信息都保存在它的系统表格里.我怀疑你是否花过比较多的时间来检查系统表格,因为你总是忙于用户表格.但是,你可能需要偶尔做一点不同寻常的事,例如数据库所有的触发器.你可 ...

  9. SQL Server单表已700w+将普通表转换成分区表1

    最近项目中,某个表数据量爆发时增长,单表已700w+,读写性能急剧下降,所以考虑加入分区表以解燃眉之急,后续还是要分表分库,当然这是后话.下面简要说一下将普通表转为分区表的步骤.   一.创建文件组 ...

随机推荐

  1. STL源码分析《4》----Traits技术

    在 STL 源码中,到处可见 Traits 的身影,其实 Traits 不是一种语法,更确切地说是一种技术. STL库中,有一个函数叫做 advance, 用来将某个迭代器(具有指针行为的一种 cla ...

  2. 指定 ubuntu server ip

    指定 ubuntu server ip,一共就两步. ■编辑配置文件sudo vi /etc/network/interfaces ■重启网络配置sudo /etc/init.d/networking ...

  3. SQL语句建表、设置主键、外键、check、default、unique约束

    · 什么是数据库? 存放数据的仓库. · 数据库和数据结构有什么区别? 数据结构要解决在内存中操作数据的问题,数据库要解决在硬盘中操作数据的问题.数据结构研究一些抽象数据模型(ADT)和以及定义在该模 ...

  4. BZOJ 3531(树链剖分+线段树)

    Problem 旅行 (BZOJ 3531) 题目大意 给定一颗树,树上的每个点有两个权值(x,y). 要求维护4种操作: 操作1:更改某个点的权值x. 操作2:更改某个点的权值y. 操作3:求a-- ...

  5. HDU 1811

    http://acm.hdu.edu.cn/showproblem.php?pid=1811 中文码题 对于等号的情况,用并查集合并(因为编号不同一定可以分出先后) 然后判断能否构成拓扑排序,以及拓扑 ...

  6. eval函数的工作原理

    如果您想详细了解eval和JSON请参考以下链接: eval  :https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Glob ...

  7. C++学习笔记1:高级语言

    笔记参考资料:http://www.learncpp.com/ 1.high languages:C,C++,Pascal,Java,Javascript,Perl... compiling proc ...

  8. 解决SimpleCursorAdapter不能自动更新的问题

    假设场景是这样的:你使用SimpleCursorAdapter显示数据,并监听数据的变化:在数据发生变化的时候,调用cursor的requery,期待UI显示也跟着变化. 但是,你可能会发现,UI并没 ...

  9. UI学习笔记---第七天

    UIScrollView   滚动视图 UIScrollView的常用属性 iPone屏幕大小限制了内容的显示,UIScrollView 类提供了屏幕滚动功能 UIScrollView是所有滑动视图的 ...

  10. 冒泡排序(python版)

    实现源码 def bubble(array): flag = len(array)- : iter = for i in range(flag): ]: array[i], array[i+]= ar ...