【问题标题】:Identity Insert error is being generated on insert (not in code)插入时生成身份插入错误(不在代码中)
【发布时间】:2017-10-11 21:12:23
【问题描述】:

我正在尝试使用以下代码构建表 - 创建表时没有错误,我可以看到结构,它表明 IDENTITY_INSERT 设置为 ON

CREATE TABLE lt_percent_cs
(
    id_key INT IDENTITY PRIMARY KEY,   
    customer_no INT ,
    season INT,
    percentage DECIMAL,

    created_by VARCHAR(15) NULL,
    create_dt DATETIME NULL,
    last_updated_by VARCHAR(15) NULL,
    last_update_dt DATETIME NULL,
    create_loc VARCHAR(16) NULL
) ON [primary]

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].lt_percent_cs 
    ADD CONSTRAINT [lt_percent_created_by] 
        DEFAULT (user_name()) FOR [created_by]
GO

ALTER TABLE [dbo].lt_percent_cs 
    ADD CONSTRAINT [lt_percent_create_dt]  
        DEFAULT (getdate()) FOR [create_dt]
GO

ALTER TABLE [dbo].lt_percent_cs 
    ADD CONSTRAINT [lt_percent_create_loc]  
        DEFAULT [dbo].fs_location() FOR [create_loc]
GO

SET IDENTITY_INSERT lt_percent_cs ON

当我尝试插入数据时出现以下错误(通过应用程序而不是通过代码)。

上次错误:数据库更新失败:
数据对象=

sqlca.sqlerrtext=SQLSTATE = 42000
适用于 SQL Server 的 Microsoft OLE DB 提供程序
当 IDENTITY_INSERT 设置为 OFF 时,无法为表 'lt_percent_cs' 中的标识列插入显式值。

没有对数据库进行任何更改。

插入 lt_percent_cs(id_key、c​​ustomer_no、季节、百分比)
值(54891、80055514、2017、50)

sqlca.sqldbcode=544

sql语法:
INSERT INTO lt_percent_cs (id_key, customer_no, season, percent) VALUES (54891, 80055514, 2017, 50)

行:1 [nvo_ds_database.uf_update.34 (544)]

我应该在 SQL Server Management Studio 中运行脚本时添加,它可以正常工作并且不会生成错误。

INSERT INTO lt_percent_cs (id_key, customer_no, season, percentage) 
VALUES (54891, 80055514, 2017, 50)

有什么想法吗?

【问题讨论】:

    标签: sql-server insert create-table identity-insert


    【解决方案1】:

    从插入语句中删除 id_key,因为 id_key 是身份种子

    INSERT INTO lt_percent_cs (customer_no, season, percentage ) VALUES ( 80055514, 2017, 50 )
    

    否则声明id_key as integer Primary Key 然后插入应该可以工作

    INSERT INTO lt_percent_cs ( id_key, customer_no, season, percentage ) VALUES ( 54891, 80055514, 2017, 50 )
    

    由于您想要批量插入数据并维护身份,我可以建议将 id_key 更改为整数主键,然后批量插入,然后将字段更改回身份为 ON...以后您不需要插入 id_key

    【讨论】:

    • 奇怪的是插入是按原样工作的——但是应用程序的前端坏了,但你确实给了我一个有趣的想法。
    • 发生了什么是我编写的脚本 - 以列作为身份的大量数据,它只是将数据导入表中,并为每一行创建一个新 ID。但是应用程序的前端它的构建方式是它调用自己的过程来根据自己的规则创建 ID 值,我不能使用身份(这很愚蠢)——所以我现在必须编写一个游标使用系统创建所有 ID 值的过程。
    • 我知道你在做什么......你在开发什么样的应用程序?
    • 您可以做的是删除身份,然后批量插入并更改字段以将身份重新设置为 ON.. 这样您就可以继续执行序列。我认为您正在尝试保留与其他表相关的 ID?
    【解决方案2】:

    如果你想在应用程序中插入一个显式的 Id,你必须设置 Identity_insert 并在一个事务中插入!我不知道,您使用的是哪个应用程序,但这个规则是通用的。

    【讨论】:

      猜你喜欢
      • 2017-03-20
      • 1970-01-01
      • 2018-10-31
      • 2017-12-03
      • 2015-04-25
      • 2015-11-25
      • 2016-06-08
      • 2011-03-25
      • 1970-01-01
      相关资源
      最近更新 更多