2016-05-21 33 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我說了什麼嗎?我展示瞭如何以及何時可以使用並覆蓋身份約束。 –

相關問題