2016-05-21 103 views
0

考虑从Microsoft's INSERT documentation下表和SQL与IDENTITY列涉及:在SQL Server中使用标识列指定“NEXT价值”为INSERT语句

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在这里工作,但有一些不工作?是否有一个关键的标记或函数会指示应使用标识列?

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

+0

我不知道你能做到这一点。这个框架是一个流行的东西吗?你确定它有这个限制吗? – DavidG

+0

该框架不是开源的,不能以这种方式解决。 –

+0

你的框架可能有选择使用存储过程插入,我相信它将是更容易的方式去走那条路。 – vittore

回答

2

如果你的SQL Server 2012及更高版本上,你可以使用顺序。但您必须先从Column1中删除IDENTITY财产。这只能通过复制和重命名新表来完成。

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) 
) 

之后,你可以在2种方法将数据插入到表:

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

INSERT INTO T1 (Column2) 
    SELECT  'Hello world' 
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') 
    
1

你能设置标识插入之前,插入,然后设置标识插入断

+0

是的,但我想要标识列来生成ID。我不想提供它。 –

1

你不能为标识列值,除非你设置IDENTITY_INSERT在此表(一个在时间)。一些例子:

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错误

+0

其实你可以。 SET IDENTITY INSERT ON – TomTom

+0

@TomTom我说了什么吗?我展示了如何以及何时可以使用并覆盖身份约束。 –

相关问题