it-swarm.com.de

Umgang mit Identitätsspalten in einer Anweisung "In TABLE Values ​​() einfügen"?

Gibt es in SQL Server 2000 oder höher überhaupt eine automatisch generierte Primärschlüssel- (Identitäts-) Spalte, wenn eine Anweisung wie die folgende verwendet wird?

Insert Into TableName Values(?, ?, ?)

Mein Ziel ist es, die Spaltennamen überhaupt NICHT zu verwenden.

29
James McMahon

Wenn Sie eine Identitätsspalte haben, müssen Sie not im Abschnitt VALUES standardmäßig angeben. Wenn Ihr Tisch ist:

ID    NAME    ADDRESS

Dann können Sie tun:

INSERT INTO MyTbl VALUES ('Joe', '123 State Street, Boston, MA')

Dadurch wird die ID automatisch für Sie generiert, und Sie müssen überhaupt nicht darüber nachdenken. Wenn Sie SET IDENTITY_INSERT MyTbl ON sind, können Sie der ID-Spalte einen Wert zuweisen.

55
Eric

Ein anderer "Trick" zum Erzeugen der Spaltenliste besteht einfach darin, den Knoten "Columns" aus dem Objekt-Explorer in ein Abfragefenster zu ziehen.

23
Aaron Bertrand

Es empfiehlt sich, die Spalten explizit aufzulisten:

Insert Into TableName(col1, col2,col2) Values(?, ?, ?)

Andernfalls wird die ursprüngliche Einfügung beschädigt, wenn Sie Ihrer Tabelle eine weitere Spalte hinzufügen.

11
A-K

Sie haben 2 Möglichkeiten:

1) Geben Sie entweder die Spaltennamenliste an (ohne Identitätsspalte).

2) SET IDENTITY_INSERT-Tabellenname ON, gefolgt von Einfügeanweisungen, die explizite Werte für die Identitätsspalte enthalten, gefolgt von SET IDENTITY_INSERT-Tabellenname OFF.

Wenn Sie eine Spaltennamenliste vermeiden, könnte dieser "Trick" vielleicht helfen ?:

-- Get a comma separated list of a table's column names
SELECT STUFF(
(SELECT 
',' + COLUMN_NAME AS [text()]
FROM 
INFORMATION_SCHEMA.COLUMNS
WHERE 
TABLE_NAME = 'TableName'
Order By Ordinal_position
FOR XML PATH('')
), 1,1, '')
6
Mitch Wheat

Da es nicht praktikabel ist, Code in einen Kommentar zu schreiben, als Antwort auf Ihren Kommentar in Erics Antwort, dass er für Sie nicht funktioniert ...

Ich habe gerade folgendes auf einer SQL 2005-Box (sorry, kein handliches 2000) mit Standardeinstellungen ausgeführt und es hat ohne Fehler funktioniert:

CREATE TABLE dbo.Test_Identity_Insert
(
    id  INT IDENTITY NOT NULL,
    my_string   VARCHAR(20) NOT NULL,
    CONSTRAINT PK_Test_Identity_Insert PRIMARY KEY CLUSTERED (id)
)
GO

INSERT INTO dbo.Test_Identity_Insert VALUES ('test')
GO

SELECT * FROM dbo.Test_Identity_Insert
GO

Senden Sie den ID-Wert möglicherweise in Ihre Werteliste? Ich glaube nicht, dass Sie die Spalte ignorieren können, wenn Sie tatsächlich einen Wert dafür übergeben. Wenn Ihre Tabelle beispielsweise 6 Spalten enthält und Sie die IDENTITY-Spalte ignorieren möchten, können Sie nur 5 Werte übergeben.

2
Tom H
set identity_insert customer on
insert into Customer(id,Name,city,Salary) values(8,'bcd','Amritsar',1234)

wobei 'Kunde' Tabellenname ist

0
sohan yadav