2009-06-01 20 views
25

In SQL Server 2000 o versione successiva c'è comunque un modo per gestire una colonna di chiave primaria (identità) generata automaticamente quando si utilizza una dichiarazione simile alla seguente?Gestione delle colonne Identity in un'istruzione "Insert Into TABLE Values ​​()"?

Insert Into TableName Values(?, ?, ?) 

Il mio obiettivo non è quello di utilizzare per i nomi delle colonne a tutti.

+4

perché non si desidera utilizzare un elenco di nomi di colonna? –

+0

@ Mitch, è un po 'complesso, ma ho un programma che genera l'SQL al volo e nel mio progetto originale non avevo a che fare con colonne di identità, quindi ho escluso i nomi delle colonne. Ho bisogno di fare un rapido aggiornamento e posso evitare di usare i nomi delle colonne per renderlo molto più semplice. –

+0

@ nemo - Essendo stato nella situazione "patch veloce" prima, ti darò un passaggio su questo per ora. Ma per favore, per il tuo bene lungo la strada, piano per specificare i nomi delle colonne nel prossimo aggiornamento completo .... – RolandTumble

risposta

49

Per impostazione predefinita, se si dispone di una colonna di identità, fare non bisogno di specificarlo nel Sezione VALORI. Se la tabella è:

ID NAME ADDRESS 

allora si può fare:

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

Questa volontà di auto-generare l'ID per voi, e non si deve pensare a questo proposito affatto. Se si SET IDENTITY_INSERT MyTbl ON, è possibile assegnare un valore alla colonna ID.

+1

Oh davvero? È fantastico. Avevo appena pensato che non avrebbe funzionato. Lasciami provare. –

+0

@Eric è corretto che cosa intendevo dire al punto 1 sopra (ho modificato per mostrare il mio intento), +1 –

+0

Eric questo non funziona affatto per me. Mi lamento che io abbia inserito l'identità, presumo perché sta cercando di inserire il primo elemento in valori in ID. Qualcosa di specifico che devi impostare per farlo ignorare la prima colonna? –

6

Hai 2 scelte:

1) specificare l'elenco dei nomi di colonna (senza la colonna di identità).

2) SET IDENTITY_INSERT tablename ON, seguito da istruzioni di inserimento che forniscono valori espliciti per la colonna identity, seguito da SET IDENTITY_INSERT tablename OFF.

Se si sta evitando un elenco di nomi di colonna, forse questo 'trucco' potrebbe aiutare ?:

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

Giusto per chiarire, con valori espliciti intendi che devi interrogare il database per vedere quale sarà la prossima identità nella sequenza sarebbe e inserirla manualmente? –

+0

No, puoi usare qualsiasi valore che non sia già lì, ma il prossimo in sequenza inizierà dal più grande uno .... –

+0

Tende solo per essere usato quando hai qualcosa come dati di riferimento che è necessario per avere il esatti stessi valori ID in diverse installazioni dell'applicazione –

2

Poiché non è pratico di mettere il codice in un commento, in risposta al tuo commento in risposta di Eric che non funziona per voi ...

Ho appena eseguito il seguente su una scatola di SQL 2005 (mi dispiace , no 2000 a portata di mano) con le impostazioni predefinite e ha funzionato senza errori:

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 

Stai forse l'invio del valore di ID più volte nella vostra lista di valori? Non penso che tu possa far ignorare la colonna se in effetti passi un valore per essa. Ad esempio, se la tua tabella ha 6 colonne e vuoi ignorare la colonna IDENTITY puoi solo passare 5 valori.

+0

La tua dichiarazione funziona bene anche per me, molto strano. –

22

Un altro "trucco" per generare l'elenco di colonne è semplicemente trascinare il nodo "Colonne" da Esplora oggetti in una finestra di query.

+3

+1 Questo mi ha aiutato molto. Tranne i suoi scoppi d'ira con parentesi quadre. – Kermit

+1

Potrebbe essere il miglior consiglio che abbia mai ricevuto da SO. Eccezionale! – ryanulit

9

La pratica migliore è quella di elencare esplicitamente le colonne: (?? ?,,)

Inserisci nella TableName (col1, col2, col2) Valori

Altrimenti il ​​vostro inserto originale si romperà se si aggiunge un altro colonna al tuo tavolo.

+0

Sì, il mio capo ha effettivamente detto la stessa cosa. Entrambi avete perfettamente ragione, ma i dati in questo database sono in permesso (vale a dire cancellati e rigenerati ogni giorno) quindi se qualcosa di simile accadesse non sarebbe la fine del mondo. –

1

Soluzione:

1) SET_IDENTITY_INSERT su ON.

2) Inserire i dati dei clienti nella tabella Clienti.

3) Impostare IDENTITY_INSERT su OFF.

leggi l'articolo completo here.

+0

La domanda non riguarda l'override della colonna Identity, ma su come evitare l'uso dei nomi dei campi e lasciare che la colonna Identity funzioni come previsto. – bummi

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

dove 'cliente' è il nome della tabella

Problemi correlati