2016-05-21 9 views
0

die folgende Tabelle und SQL von Microsoft's INSERT documentation Betrachten Sie die mit Identity-Spalten behandelt:Geben Sie „NEXT VALUE“ für INSERT-Anweisung Identitätsspalte in SQL Server

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

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

Die INSERT Anweisung nicht column_1 als eine Spalte von der angeben wird Tabelle und SQL Server füllt automatisch den nächsten Wert für diese Identitätsspalte. Dies ist die normale Art und Weise, wie Identitätsspalten behandelt werden.

Wie kann ich das gleiche Verhalten haben und gleichzeitig den Spaltennamen angeben?

Zum Beispiel, ich suche für etwas wie:

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

Ich glaube nicht, NEXT VALUE Werke hier, aber es ist etwas, das funktioniert? Gibt es ein Schlüssel-Token oder eine Funktion, die angibt, dass die Identitätsspalte verwendet werden soll?

Hinweis: Der Grund warum ich frage ist, dass das Framework, das ich verwende, alle Spalten benötigt, die in der Spaltenliste angegeben werden.

+0

Ich bin nicht sicher, dass Sie das tun können. Ist dieser Rahmen eine beliebte Sache? Sind Sie sicher, dass es diese Einschränkung hat? – DavidG

+0

Das Framework ist keine Open Source und kann auf diese Weise nicht repariert werden. –

+0

Ihr Framework möglicherweise eine Option Store-Prozedur für einfügen verwenden, ich glaube, es wird einfacher Weg, diese Straße zu gehen. – vittore

Antwort

2

Wenn Sie auf SQL Server 2012 und höher, Sie können die Sequenz verwenden. Aber Sie müssen zuerst die IDENTITY Eigenschaft von Column1 entfernen. Dies kann nur durch Kopieren und Umbenennen einer neuen Tabelle erfolgen.

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

Danach können Sie Daten in die Tabelle auf 2 Arten einsetzen:

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

INSERT INTO T1 (Column2) 
    SELECT  'Hello world' 
0

Ich bin ziemlich sicher, dass es keine Möglichkeit gibt, das mit SQL Server zu tun. Zwei Problemumgehungen, die ich mir vorstellen kann:

  1. Fix die Bibliothek wenn möglich.
  2. Wenn die Bibliothek dies unterstützt, können Sie stattdessen eine Ansicht und INSERT erstellen. Zum Beispiel:

    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

Können Sie die Identität festgelegt auf einfügen vor dem Einsetzen und legen Sie dann die Identität einfügen off

+0

Ja, aber ich möchte, dass die Identity-Spalte die ID generiert. Ich will es nicht liefern. –

1

Sie nicht Wert für Identitätsspalte festlegen können, wenn Sie identity_insert auf für diese Tabelle (ein zum Zeitpunkt). Einige Beispiele:

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 

Natürlich, wenn Sie die nächste Identität auf einen Wert zurückgesetzt, der mit PK (gemeinsamer Nutzung der Identität) in Konflikt Sie haben Violation of PRIMARY KEY constraint Fehler

+0

Eigentlich können Sie. SET IDENTITY INSERT ON – TomTom

+0

@TomTom habe ich etwas Gegenteiliges gesagt? Ich zeigte, wie und wann Sie Identity Constraint verwenden und überschreiben können. –