Sql server SQL Server生成的错误数据脚本如何不在insert语句中设置标识?

Sql server SQL Server生成的错误数据脚本如何不在insert语句中设置标识?,sql-server,ssms,Sql Server,Ssms,我正在使用SQLServerManagementStudio生成一个SQL脚本(大脚本)来更新Azure SQL数据库。问题在于,脚本是在IDENTITY打开的情况下生成的,而insert语句是使用ID列导出的,这导致了以下错误: 无法在表“table_Name”中插入标识列的显式值 当IDENTITY_INSERT设置为OFF时 我的问题是如何生成正确的脚本,该脚本将不会在和插入上使用标识?使用设置标识\u插入的快速示例如下: 使用Sql Server Management Studio(SS

我正在使用SQLServerManagementStudio生成一个SQL脚本(大脚本)来更新Azure SQL数据库。问题在于,脚本是在
IDENTITY
打开的情况下生成的,而insert语句是使用ID列导出的,这导致了以下错误:

无法在表“table_Name”中插入标识列的显式值 当IDENTITY_INSERT设置为OFF时


我的问题是如何生成正确的脚本,该脚本将不会在和插入上使用标识?

使用
设置标识\u插入的快速示例如下:

使用Sql Server Management Studio(SSMS)中的生成脚本任务生成包含数据的脚本时,将为具有标识列的表包含
set identity\u insert
语句

在对象资源管理器中:任务->生成脚本->[所有表或选定表]->高级->[带数据或数据的架构]

  • 如果要从编写数据脚本的表没有带有identity属性的列,它将不会生成
    set identity\u insert
    语句

  • 如果要为中的数据编写脚本的表中没有带有identity属性的列,它将生成
    set identity\u insert
    语句

使用SSMS 208和SSMS 2012进行测试和确认

在OP的情况下,我猜源表没有为源表中的
my_table\u id
设置identity属性,但为目标表中的
my_table\u id
设置了identity属性

要获得所需的输出,请将表更改为脚本数据,从改为具有
my_table\u id
以具有identity属性

本文深入解释了执行此操作的步骤(不在SSMS中使用设计器):

  • 使用identity属性创建一个新列

  • 将数据从现有id列传输到新列

  • 删除现有id列

  • 将新列重命名为原始列名


这是上述rextester示例中使用的示例代码

create table table_w_identity (
    IdentityColumn int identity (1,1)
  , OtherColumn nvarchar(128)
  , constraint pk_table_w_identity primary key clustered (IdentityColumn asc)
  , constraint uc_table_w_identity_OtherColumn unique (OtherColumn)
  );

set identity_insert dbo.table_w_identity on;
  insert into dbo.table_w_identity (IdentityColumn, OtherColumn)
    values (1, 'identity_insert is on');
    /* succeeds */

set identity_insert dbo.table_w_identity off;
  insert into dbo.table_w_identity (OtherColumn)
    values ('identity_insert is off');
    /* succeeds */
以下两条语句失败:

set identity_insert dbo.table_w_identity off;
  insert into dbo.table_w_identity (IdentityColumn, OtherColumn)
    values (3, 'identity_insert is off, this fails because identitycolumn is trying to be inserted');
    /* fails */
错误:当identity_insert设置为OFF时,无法在表“table_w_identity”中为identity列插入显式值

错误:当identity_INSERT设置为ON或复制用户正在插入NOT for复制标识列时,必须为表“table_w_identity”中的标识列指定显式值

这是我从SSMS生成脚本时的输出,该脚本仅用于上述rextester中使用的示例表的数据:

SET IDENTITY_INSERT [dbo].[table_w_identity] ON 

INSERT [dbo].[table_w_identity] ([IdentityColumn], [OtherColumn]) VALUES (2, N'identity_insert is off')
INSERT [dbo].[table_w_identity] ([IdentityColumn], [OtherColumn]) VALUES (1, N'identity_insert is on')
SET IDENTITY_INSERT [dbo].[table_w_identity] OFF
文件:
-

现在这是一篇相当古老的文章,但我只提供了一个答案,没有解决这个问题,即使用Generate脚本导出/导入数据库充其量是不可靠的

我曾多次使用向导生成脚本,然后在一个空白数据库中使用它们,并且出现了这个错误,而实际上根本没有任何错误的原因

最佳流程是:

  • 仅生成架构并首先创建数据库
  • 禁用所有约束:
    EXEC sp_MSforeachtable“ALTER TABLE?”?NOCHECK约束all'
  • 生成数据,但是,,关键是,不要试图一下子做所有事情。一次做一张桌子,或者一批一批地做
  • 在出现任何错误时,截断出错批处理中的所有表,并尝试修复错误
  • 如果成功导入每个表,请重新启用约束:
    exec sp_MSforeachtable@command1='ALTER table?使用“全部检查约束”
  • 我不知道为什么,但是SSMS和sqlcmd(我在2008R2上)在运行大型脚本时似乎都有问题。我最后一次失败是,
    没有为所需参数提供值,
    在一行上是绝对正确的;当作为一个小批量运行时,它工作正常

    OP的错误是由这样一个事实引起的:如果发生了如上所述的虚假错误,那么脚本将以错误状态结束,并且内置的
    set identity\u insert on
    语句无法工作

    注意:generatescripts命令有一个“每个对象一个文件”选项,这可能也是一个好方法


    希望这对别人有帮助

    设置标识_INSERT ON;在您希望自己插入标识的位置。完成该操作后,将IDENTITY_INSERT设置为OFF;嗯,我分配了很多表,脚本很大,大约300兆。手动关闭所有SET IDENTITY_INSERT为off安全吗?关闭所有表的IDENTITY INSERT我已将其更改为off
    SET IDENTITY_INSERT [dbo].[table_w_identity] ON 
    
    INSERT [dbo].[table_w_identity] ([IdentityColumn], [OtherColumn]) VALUES (2, N'identity_insert is off')
    INSERT [dbo].[table_w_identity] ([IdentityColumn], [OtherColumn]) VALUES (1, N'identity_insert is on')
    SET IDENTITY_INSERT [dbo].[table_w_identity] OFF