【问题标题】:SQL Server 2008 R2: IDENTITYSQL Server 2008 R2:身份
【发布时间】:2014-11-11 13:48:42
【问题描述】:

Q 1
我有一个空表来插入记录。有一列IDENTITY 类型,我想为其手动插入值。

示例

表:员工

create table Employee
(
  ID int IDENTITY(1,1) PRIMARY KEY,
  LastName varchar(255) NOT NULL,
  FirstName varchar(255),
  Address varchar(255),
  City varchar(255)
 )

插入记录:

SET IDENTITY_INSERT Employee ON;
insert into Employee values(101,'ABC','XYZ','HighStreet','Moscow')

错误

消息 8101,第 16 级,状态 1,第 1 行
只有在使用列列表并且 IDENTITY_INSERT 为 ON 时,才能为表 'Employee' 中的标识列指定显式值。

Q 2

如何在不使用MAXTop 的情况下获取最新插入的员工ID

【问题讨论】:

标签: sql-server sql-server-2008-r2


【解决方案1】:

回答 1

如果您尝试将值插入到标识列中,您将收到错误消息

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

在插入脚本之前写入 SET IDENTITY_INSERT 表名 ON 并且 SET IDENTITY_INSERT 表名在插入脚本后关闭

SET IDENTITY_INSERT Employee ON
    insert into Employee(ID,LastName,FirstName,Address,City) values   
    (101,'ABC','XYZ','HighStreet','Moscow')
SET IDENTITY_INSERT Employee OFF

答案 2

在插入语句后有几种使用方式

在 INSERT、SELECT INTO 或批量复制语句完成后, @@IDENTITY 包含由 声明

SELECT @@IDENTITY

它返回在连接上产生的最后一个 IDENTITY 值, 不管产生值的表是什么,也不管 产生值的语句的范围。

SELECT SCOPE_IDENTITY()

它返回在连接上产生的最后一个 IDENTITY 值,并由 同一范围内的语句,而不管生成的表 价值。

SELECT IDENT_CURRENT(‘Employee’)

它返回表中生成的最后一个 IDENTITY 值,无论 创造价值的连接,无论其范围如何 产生值的语句。 IDENT_CURRENT 不受限制 范围和会话;它仅限于指定的表。 IDENT_CURRENT 返回为任何特定表生成的标识值 会话和任何范围。

MSDN SOURCE

【讨论】:

  • 这回答了 OP 问题,没有解决错误,我认为这就是他们所要求的 - 不是 100% 确定
  • @Ganesh_Devlekar,非常感谢。
  • 你不能做 --insert into Employee(myID,name) values( /* and have 5 values in here */)
  • 我建议总是使用 SCOPE_IDENTITY() 而不是其他任何东西来获取新插入的标识值。 See this blog post for an explanation as to WHY
【解决方案2】:

您可以使用IDENT_CURRENT( 'table_name' ) 获取当前值。

【讨论】:

【解决方案3】:

对于标识列的外部值,明确给出的列名必须如下

SET IDENTITY_INSERT Employee ON;
insert into Employee(ID ,LastName,FirstName,Address,City)
values(101,'ABC','XYZ','HighStreet','Moscow')

【讨论】:

    猜你喜欢
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多