如何使用identity列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用identity列相关的知识,希望对你有一定的参考价值。

set identity course on
insert into course (cno,cname,ccredit)values(8,'english',6)
set identity insert course off
它提示我说服务器: 消息 156,级别 15,状态 1,行 1
在关键字 'identity' 附近有语法错误。
服务器: 消息 156,级别 15,状态 1,行 3
在关键字 'identity' 附近有语法错误。

identity(起始值,步长),你没有设置起始值和增长值,而且在insert操作的时候不需要对这列操作,会自动增长的 参考技术A 对于identity(标识种子)列是不需要显示的指定值的,可以按照默认设置好的增长来自动填充值,
因此可以将语句修改成:
set identity course on
insert into course (cname,ccredit)values('english',6)
set identity insert course off
呵呵,希望能有帮助,^_^
参考技术B set IDENTITY_INSERT course on
set IDENTITY_INSERT course off

如何从 SQL Server SELECT 语句返回新的 IDENTITY 列值?

【中文标题】如何从 SQL Server SELECT 语句返回新的 IDENTITY 列值?【英文标题】:How do I return a new IDENTITY column value from an SQLServer SELECT statement? 【发布时间】:2010-11-01 20:57:12 【问题描述】:

我正在插入带有自动递增键字段的 SQLServer 表。 (我相信这在 SQLServer 中称为 IDENTITY 列。)

在 Oracle 中,我可以使用 RETURNING 关键字为我的 INSERT 语句提供一个结果集,例如 SELECT 查询,它将返回生成的值:

INSERT INTO table
(foreign_key1, value)
VALUES
(9, 'text')
RETURNING key_field INTO :var;

如何在 SQLServer 中完成此操作?

奖励:好的,到目前为止答案都很好,但是如果可能的话,我该如何将它放在一个语句中? :)

【问题讨论】:

【参考方案1】:
SELECT SCOPE_IDENTITY()

编辑:玩一玩……

如果只有OUTPUT 子句支持局部变量。

无论如何,要获得一系列 ID 而不是单例

DECLARE @Mytable TABLE (keycol int IDENTITY (1, 1), valuecol varchar(50))

INSERT @Mytable (valuecol) 
OUTPUT Inserted.keycol
SELECT 'harry'
UNION ALL
SELECT 'dick'
UNION ALL
SELECT 'tom'

编辑 2:一次通话。我从来没有机会使用这个结构。

DECLARE @Mytable TABLE (keycol int IDENTITY (1, 1), valuecol varchar(50))

INSERT @Mytable (valuecol) 
OUTPUT Inserted.keycol
VALUES('foobar')

【讨论】:

我支持这个。 SCOPE_IDENTITY() 返回最近查询范围内的最新身份。其他方法@@IDENTITY 和 IDENT_CURRENT() 不限于特定范围【参考方案2】:

SCOPE_IDENTITY

【讨论】:

【参考方案3】:

除了@@IDENTITY,您还应该查看SCOPE_IDENTITY() 和IDENT_CURRENT()。您很可能需要 SCOPE_IDENTITY()。 @@IDENTITY 有一个问题,它可能会返回在您尝试跟踪的实际表的触发器中创建的标识值。

此外,这些是单值函数。我不知道 Oracle RETURNING 关键字是如何工作的。

【讨论】:

【参考方案4】:

您可以使用OUTPUT INTO,它的额外好处是能够捕获插入的多个身份。

【讨论】:

【参考方案5】:

一般来说,不能在一条语句中完成。

但是 SELECT SCOPE_IDENTITY() 可以(并且应该)直接放在 INSERT 语句之后,所以这一切都在同一个数据库调用中完成。

例子:

mydb.ExecuteSql("INSERT INTO table(foreign_key1, value) VALUES(9, 'text'); SELECT SCOPE_IDENTITY();");

您可以使用 OUTPUT,但您应该注意它有一些限制:

http://msdn.microsoft.com/en-us/library/ms177564.aspx

【讨论】:

难以置信。我不知道我可以结合这样的陈述。聪明、不标准、丑陋、有用……所有这些形容词都会浮现在脑海中。 :) 可以在 SQL Server 2005 的一条语句中使用 OUTPUT 完成【参考方案6】:

INSERT INTO table(foreign_key1, value)VALUES(9, 'text');SELECT @@IDENTITY;

【讨论】:

【参考方案7】:

这取决于您的调用上下文。

如果您从客户端代码中调用它,您可以使用 OUTPUT 然后读取返回的值。

DECLARE @t TABLE (ColID int IDENTITY, ColStr varchar(20))

INSERT INTO @t (ColStr)
OUTPUT Inserted.ColID
VALUES ('Hello World')

结果:

      ColID
-----------
          1

如果您将其包装在存储过程中,则使用 OUTPUT 的工作量更大。在那里,您将想要使用 SCOPE_IDENTITY(),但您不能在单个语句中执行此操作。当然,您可以使用“;”将多个语句放在一行中分隔符,但这不是一个单独的语句。

DECLARE @idValue    int
DECLARE @t TABLE (ColID int IDENTITY, ColStr varchar(20))

INSERT INTO @t (ColStr) VALUES ('Hello World')

SELECT @idValue = SCOPE_IDENTITY()

结果:@idValue 变量包含标识值。使用 OUTPUT 参数返回值。

【讨论】:

以上是关于如何使用identity列的主要内容,如果未能解决你的问题,请参考以下文章

数据库中关键字identity如何使用?

如何使用 Asp.Net Core 2.2 / IdentityServer4 / SP.NET Core Identity 手动散列密码

如何轻松找到有溢出危险的 IDENTITY 列?

如何去除SqlServer的自增字段 不用identity_insert和创建新列 还有别的方法么? 这个列里有数据,不能动

如何从 SQL Server SELECT 语句返回新的 IDENTITY 列值?

如何在 Redshift 中打开/关闭 IDENTITY_INSERT