web-dev-qa-db-fra.com

Gestion des colonnes d'identité dans une instruction "Insérer dans une table ()"?

Dans SQL Server 2000 ou supérieur, y a-t-il un moyen de gérer une colonne de clé primaire (identité) générée automatiquement lors de l’utilisation d’une instruction comme celle-ci?

Insert Into TableName Values(?, ?, ?)

Mon objectif est de ne PAS utiliser les noms de colonnes.

29
James McMahon

Par défaut, si vous avez une colonne d'identité, vous devez spécifier non dans la section VALUES. Si votre table est:

ID    NAME    ADDRESS

Ensuite, vous pouvez faire:

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

Cela générera automatiquement l'ID pour vous et vous n'aurez pas à y penser du tout. Si vous SET IDENTITY_INSERT MyTbl ON, vous pouvez affecter une valeur à la colonne ID.

55
Eric

Une autre "astuce" pour générer la liste des colonnes consiste simplement à faire glisser le nœud "Colonnes" de l'explorateur d'objets vers une fenêtre de requête.

23
Aaron Bertrand

La meilleure pratique consiste à répertorier explicitement les colonnes:

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

Sinon, votre insertion d'origine sera rompue si vous ajoutez une autre colonne à votre table.

11
A-K

Vous avez 2 choix:

1) Spécifiez la liste de noms de colonnes (sans la colonne d’identité).

2) SET IDENTITY_INSERT nom_table ON, suivi des instructions insert fournissant des valeurs explicites pour la colonne d'identité, suivi de SET IDENTITY_INSERT nom_table OFF.

Si vous évitez une liste de noms de colonnes, peut-être que cette astuce pourrait vous aider:

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

Puisqu'il n'est pas pratique de mettre du code dans un commentaire, en réponse à votre commentaire dans la réponse d'Eric, cela ne fonctionne pas pour vous ...

Je viens d'exécuter ce qui suit sur une boîte SQL 2005 (désolé, pas pratique 2000) avec les paramètres par défaut et cela a fonctionné sans erreur:

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

Vous envoyez peut-être la valeur de l'ID dans votre liste de valeurs? Je ne pense pas que vous puissiez le faire ignorer la colonne si vous lui transmettez une valeur. Par exemple, si votre table comporte 6 colonnes et que vous souhaitez ignorer la colonne IDENTITY, vous ne pouvez transmettre que 5 valeurs.

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

où 'client' est le nom de la table

0
sohan yadav