重新设定大型sql表的种子

重新设定大型sql表的种子,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,使用版本: Microsoft SQL Server 2008 R2 (SP3-OD) (KB3144114) - 10.50.6542.0 (Intel X86) Feb 22 2016 18:12:09 Copyright (c) Microsoft Corporation Standard Edition on Windows NT 5.2 <X86> (Build : ) 我甚至尝试删除该列,以便稍后重新创建,但我遇到了同样的问题 谢谢 更新: 表结构: CREATE

使用版本:

Microsoft SQL Server 2008 R2 (SP3-OD) (KB3144114) - 10.50.6542.0 (Intel X86) 
Feb 22 2016 18:12:09 
Copyright (c) Microsoft Corporation
Standard Edition on Windows NT 5.2 <X86> (Build : )
我甚至尝试删除该列,以便稍后重新创建,但我遇到了同样的问题

谢谢

更新:

表结构:

CREATE TABLE [dbo].[tblEmailsSent](
    [id] [int] IDENTITY(1,1) NOT NULL,  -- this is what it should be. currently its just an `[int] NOT NULL`
    [Sent] [datetime] NULL,
    [SentByUser] [nvarchar](50) NULL,
    [ToEmail] [nvarchar](150) NULL,
    [StudentID] [int] NULL,
    [SubjectLine] [nvarchar](200) NULL,
    [MessageContent] [nvarchar](max) NULL,
    [ReadStatus] [bit] NULL,
    [Folder] [nvarchar](50) NULL,
 CONSTRAINT [PK_tblMessages] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

我认为你的问题是重复的。上面这个问题有一个非常适合你的情况的答案。我将在下面复制它的基本部分


但在此之前,让我们澄清一下为什么会出现超时错误

您正试图将
IDENTITY
属性添加到现有列中。您正在为此使用SSMS GUI。一个简单的
ALTER COLUMN
语句无法实现这一点,即使可以,SSMS也会生成一个脚本,创建一个新表,将数据复制到新表中,删除旧表,并将新表重命名为旧名称。当您通过SSMS GUI执行此操作时,它将以30秒的预定义超时运行其脚本

当然,您可以在SSMS中更改此设置并增加超时,但有一种更好的方法

  • 简单/懒惰的方式
  • 使用SSMS GUI更改列定义,然后在表设计器中单击“生成更改脚本”,而不是单击“保存”

    然后将此脚本保存到文件中,并查看GUI在场景后面运行的生成的T-SQL代码

    您将看到它使用所需的模式创建一个临时表,复制数据,重新创建外键和索引,删除旧表并重命名新表

    脚本本身通常是正确的,但请密切注意其中的事务。由于某些原因,SSM通常不会对整个操作使用单个事务,而是使用多个事务。我建议手动检查脚本,确保顶部只有一个
    begintransaction
    ,最后只有一个
    COMMIT
    。您不希望以一个半途而废的操作结束,比如说,一个删除了所有索引和外键的表

    如果是一次性手术,对你来说就足够了。您的表只有2.4GB,因此可能需要几分钟,但不应该是几个小时

    如果您自己在SSMS中运行T-SQL脚本,则默认情况下没有超时。如果时间太长,你可以自己停下来


  • 贾斯汀·格兰特(Justin Grant)在本书中详细介绍了智能快速的方法
  • 主要思想是使用该语句仅对元数据进行更改,而不对表的每一页进行更改

    BEGIN TRANSACTION;
    
    -- create a new table with required schema
    CREATE TABLE [dbo].[NEW_tblEmailsSent](
        [id] [int] IDENTITY(1,1) NOT NULL,
        [Sent] [datetime] NULL,
        [SentByUser] [nvarchar](50) NULL,
        [ToEmail] [nvarchar](150) NULL,
        [StudentID] [int] NULL,
        [SubjectLine] [nvarchar](200) NULL,
        [MessageContent] [nvarchar](max) NULL,
        [ReadStatus] [bit] NULL,
        [Folder] [nvarchar](50) NULL,
     CONSTRAINT [PK_tblEmailsSent] PRIMARY KEY CLUSTERED 
    (
        [id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    
    -- switch the tables
    ALTER TABLE [dbo].[tblEmailsSent] SWITCH TO [dbo].[NEW_tblEmailsSent];
    
    -- drop the original (now empty) table
    DROP TABLE [dbo].[tblEmailsSent];
    
    -- rename new table to old table's name
    EXEC sp_rename 'NEW_tblEmailsSent','tblEmailsSent';
    
    COMMIT;
    

    新表具有
    IDENTITY
    属性后,通常应将当前标识值设置为表中实际值的最大值。如果不这样做,插入表中的新行将从1开始

    一种方法是在切换表后运行:

    DBCC CHECKIDENT('dbo.tblEmailsSent')
    
    或者,可以在表定义中指定新种子:

    CREATE TABLE [dbo].[NEW_tblEmailsSent](
        [id] [int] IDENTITY(<max value of id + 1>, 1) NOT NULL,
    
    创建表[dbo]。[NEW\u tblEmailsSent](
    [id][int]标识(,1)不为空,
    
    你是在C#或VB中使用SqlCommand还是直接使用工作表单SSMS?不要使用SSMS UI来更改表架构。使用t-SQL脚本可以更有效地完成此操作,如果需要帮助,请发布现有表的DDL。谢谢各位。是的,我使用的是SSMS。我已在问题中粘贴了
    创建
    代码。此表很重s现在大约在2.4GB…谢谢。谢谢你提供详细的答案。我将版本添加到OP中。这是我在尝试运行解决方案#2:
    ALTER TABLE SWITCH语句时遇到的错误。表“dbo.NEW_tblEmailsSent”具有聚集索引“PK_tblEmailsSent”,而表“dbo.tblEmailsSent”没有聚集索引例如
    错误消息很清楚-一个表有聚集索引,另一个没有。请确保新表的定义与现有表完全相同,除了
    标识部分。使用SSMS生成
    创建表
    脚本。hmmm…获取
    注意:更改对象名称的任何部分可能会破坏脚本和存储过程。
    @kneidels,是的,这是来自
    sp_rename
    的警告。SSMS生成的脚本也使用
    sp_rename
    ,但是当您通过GUI运行它时,您看不到此警告。我如何通过GUI运行它?您的意思是保存脚本然后运行它吗?我认为运行脚本的全部意义在于T-SQL,是不是更快?
    CREATE TABLE [dbo].[NEW_tblEmailsSent](
        [id] [int] IDENTITY(<max value of id + 1>, 1) NOT NULL,