指定" NEXT VALUE" for SQLERT中使用标识列的INSERT语句

时间:2016-05-21 22:33:04

标签: sql sql-server sql-insert

考虑以下表格和来自Microsoft's INSERT documentation的处理IDENTITY列的SQL:

CREATE TABLE dbo.T1 (column_1 int IDENTITY, column_2 VARCHAR(30));
GO

INSERT T1 (column_2) VALUES ('Row #2');

INSERT语句未将column_1指定为表的列,SQL Server会自动填充该标识列的下一个值。这是处理标识列的常规方式。

如何同时指定列名?

我有相同的行为

例如,我正在寻找之类的东西

INSERT INTO T1 (column_1, column_2) 
VALUES (NEXT VALUE, 'Row #3');
GO

我不相信NEXT VALUE在这里工作,但有什么可行吗?是否有一个密钥令牌或函数表明应该使用标识列?

注意:我问的原因是我使用的框架要求在列列表中指定所有列。

4 个答案:

答案 0 :(得分:4)

如果您使用的是SQL Server 2012及更高版本,则可以使用序列。但您必须先从Column1删除CREATE SEQUENCE Column1_Sequence AS int START WITH 0; CREATE TABLE T1 ( Column1 int DEFAULT (NEXT VALUE FOR Column1_Sequence) PRIMARY KEY , Column2 nvarchar(30) ) 属性。这只能通过复制和重命名新表来完成。

INSERT INTO T1 (Column1, Column2)
    SELECT      NEXT VALUE FOR Column1_Sequence
            ,   'Row #2'

INSERT INTO T1 (Column2)
    SELECT      'Hello world'

之后,您可以通过两种方式将数据插入表中:

{{1}}

答案 1 :(得分:1)

您可以在插入之前设置标识插入,然后设置标识插入

答案 2 :(得分:1)

除非为此表设置identity_insert(一次一个),否则不能为identity列设置值。一些例子:

create table #tmp (id int identity(1,1), name varchar(10))

insert #tmp (id,name) values (2,'test')
--error Cannot insert explicit value for identity column in table '#tmp

set identity_insert #tmp on --for one table in DB
insert #tmp (id,name) values (2,'qwas')
select * from #tmp
set identity_insert #tmp off -- good practice
--works

--see current identity value
SELECT IDENT_CURRENT ('#tmp') AS Current_Identity;

--Reset identity value
DBCC CHECKIDENT (#tmp, RESEED, 999)
--next insert will be 1000

当然,如果您将下一个身份重置为与PK冲突的值(身份的常见用法),则会出现Violation of PRIMARY KEY constraint错误

答案 3 :(得分:0)

我很确定使用SQL Server无法做到这一点。我能想到的两种解决方法:

  1. 尽可能修复库。
  2. 如果库支持它,您可以创建一个视图并将其插入到该视图中。例如:

    CREATE TABLE MyTable
    (
        ID INT IDENTITY(1, 1),
        SomeColumn VARCHAR(100)
    )
    
    GO
    CREATE VIEW MyTableView
    AS
    SELECT SomeColumn
    FROM MyTable
    
    GO
    INSERT INTO MyTableView (SomeColumn) VALUES ('Test')