2009-06-01 4 views
25

Dans SQL Server 2000 ou version ultérieure, est-il possible de gérer une colonne de clé primaire (identité) générée automatiquement lors de l'utilisation d'une instruction comme celle-ci?Gestion des colonnes d'identité dans une instruction "Insérer dans des valeurs TABLE()"?

Insert Into TableName Values(?, ?, ?) 

Mon but est de NE PAS utiliser les noms de colonnes.

+4

pourquoi ne voulez-vous pas utiliser une liste de noms de colonnes? –

+0

@Mitch, c'est plutôt complexe, mais j'ai un programme qui génère le SQL à la volée et dans ma conception d'origine je n'avais pas de colonnes d'identité, donc j'ai exclu les noms de colonnes. J'ai besoin de faire une mise à jour rapide et je peux éviter d'utiliser des noms de colonnes, cela rendrait cela beaucoup plus facile. –

+0

@ nemo-- Ayant été dans la situation de "patch rapide" avant, je vais vous donner un laissez-passer pour le moment. Mais s'il vous plaît, pour votre propre plaisir, prévoyez de spécifier les noms de colonnes dans la prochaine mise à jour complète .... – RolandTumble

Répondre

49

Par défaut, si vous avez une colonne d'identité, vous ne pas besoin de le préciser dans le Section VALUES. Si votre table est:

ID NAME ADDRESS 

Ensuite, vous pouvez faire:

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

Cette volonté génère automatiquement l'ID pour vous, et vous ne devez pas penser du tout. Si vous SET IDENTITY_INSERT MyTbl ON, vous pouvez affecter une valeur à la colonne ID.

+1

Oh vraiment? C'est fantastique. J'avais juste supposé que ça ne marcherait pas. Laissez-moi essayer. –

+0

@Eric est correct que ce que je voulais dire au point 1 ci-dessus (ont édité pour montrer mon intention), +1 –

+0

Eric cela ne fonctionne pas pour moi du tout. Il se plaint que j'ai, l'insertion d'identité éteinte, je suppose parce qu'il essaye d'insérer le premier article dans des valeurs dans l'identification. Quelque chose de spécifique que vous devez définir pour l'obtenir pour ignorer la première colonne? –

6

Vous avez 2 choix:

1) Soit spécifier la liste des noms de colonne (sans la colonne d'identité).

2) SET IDENTITY_INSERT nom_table ON, suivi des instructions d'insertion qui fournissent des valeurs explicites pour la colonne d'identité, suivies de SET IDENTITY_INSERT nom_table OFF.

Si vous évitez une liste de nom de colonne, peut-être ce « truc » pourrait 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, '') 
+0

Juste pour clarifier, par des valeurs explicites, vous voulez dire que vous devez interroger la base de données pour voir quelle est la prochaine identité dans la séquence serait et insérez-le manuellement? –

+0

Non, vous pouvez utiliser n'importe quelle valeur qui n'est pas déjà là, mais la suivante dans la séquence commencera à partir du plus grand plus un .... –

+0

Il a tendance à être utilisé uniquement lorsque vous avez quelque chose comme les données de référence –

2

Comme il est pas pratique de mettre le code dans un commentaire, en réponse à votre commentaire dans la réponse de Eric que cela ne fonctionne pas pour vous ...

Je viens de rencontrer ce qui suit sur une boîte SQL 2005 (désolé , pas très 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 envoient peut-être la valeur d'identité sur votre liste de valeurs? Je ne pense pas que vous pouvez le faire ignorer la colonne si vous lui transmettez une valeur. Par exemple, si votre table a 6 colonnes et que vous voulez ignorer la colonne IDENTITY, vous ne pouvez transmettre que 5 valeurs.

+0

Votre déclaration fonctionne bien pour moi aussi, très étrange. –

22

Une autre "astuce" pour générer la liste de colonnes consiste simplement à faire glisser le noeud "Colonnes" de l'Explorateur d'objets sur une fenêtre de requête.

+3

+1 Celui-ci m'a beaucoup aidé. Sauf que ce sont des crises de colère avec des crochets. – Kermit

+1

Peut-être le meilleur conseil que j'ai jamais eu de SO. Impressionnant! – ryanulit

9

La meilleure pratique est de lister explicitement les colonnes: (? ?,,)

Insérer dans TableName (col1, col2, col2) Valeurs

Sinon, votre insert d'origine cassera si vous ajoutez un autre colonne à votre table.

+0

Oui, mon patron a dit la même chose. Vous avez tous les deux raison, mais les données de cette base de données sont permises (c'est-à-dire éliminées et régénérées quotidiennement), donc si quelque chose comme ça arrivait, ce ne serait pas la fin du monde. –

1

Solution:

1) Ensemble IDENTITY_INSERT sur ON.

2) Insérer les données clients dans la table client.

3) Définissez IDENTITY_INSERT sur OFF.

lire l'article complet here.

+0

La question n'est pas de contourner la colonne d'identité, mais plutôt de savoir comment éviter l'utilisation des noms de champs et laisser la colonne d'identité fonctionner comme prévu. – bummi

0
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

Questions connexes