Ipossibile aggiornare la colonna Identity

lunedì 18 aprile 2011 - 16.54
Tag Elenco Tags  SQL Server 2005

massimo1965 Profilo | Junior Member

Ciao
in una procedura che sto creando, di cui non sto ad annoiarvi, riesco ad inserire dei record in una tabella con un campo identiy, mettendo il valore di tale campo a -1, ma quando cerco di cambiarlo il sistema mi dice : Impossibile aggiornare la colonna Identity

per inserire tali record con il valore indentiy a -1 uso prima dell'inserimento : SET IDENTITY_INSERT <table_name> ON

dov'è che sbaglio....
grazie.

lbenaglia Profilo | Guru

>in una procedura che sto creando, di cui non sto ad annoiarvi,
>riesco ad inserire dei record in una tabella con un campo identiy,
>mettendo il valore di tale campo a -1, ma quando cerco di cambiarlo
>il sistema mi dice : Impossibile aggiornare la colonna Identity
>
>per inserire tali record con il valore indentiy a -1 uso prima
>dell'inserimento : SET IDENTITY_INSERT <table_name> ON
>
>dov'è che sbaglio....

Ciao Massimo,

Mi sa tanto che per rispondere alla domanda dovrai "annoiarci" con tutti i dettagli
Posta un esempio completo che riproduce l'anomalia.

>grazie.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

massimo1965 Profilo | Junior Member

ci provo....
sull'ultima query mi da l'errore che vi dicevo...

CREATE TABLE [dbo].[anag_clienti_a](
[id_cliente] [int] IDENTITY(1,1) NOT NULL,
[rag_soc] [varchar](100) NULL
) ON [PRIMARY]
go
CREATE TABLE [dbo].[anag_clienti_b](
[id_cliente] [int] IDENTITY(1,1) NOT NULL,
[rag_soc] [varchar](100) NULL,
[remote_id] [int] NULL,
[stato] [tinyint] NULL
) ON [PRIMARY]
-- creo due records nella tabella di base
INSERT INTO anag_clienti_a (rag_soc) values ('pippo')
INSERT INTO anag_clienti_a (rag_soc) values ('pluto')
go
-- li copio nella tabella di destino
insert into anag_clienti_b (rag_soc,remote_id,stato) select rag_soc,id_cliente,0 from anag_clienti_a
go
-- i record vengono modificati
update anag_clienti_a set rag_soc = 'xxxxx' where id_cliente = 1
update anag_clienti_a set rag_soc = 'yyyyy' where id_cliente = 2
go
-- voglio riportare il tutto uguale nella tabella di destino
set identity_insert anag_clienti_b on
go
insert into anag_clienti_b (id_cliente,rag_soc,remote_id,stato) select -1 id_cliente,rag_soc,id_cliente,1 from anag_clienti_a
go
-- qui mi da errore...
update f1 set f1.id_cliente = f2.id_cliente from anag_clienti_b f1
inner join (
select id_cliente,remote_id from anag_clienti_b where stato = 0
) f2 on f2.remote_id = f1.remote_id
where f1.stato = 1
go

lbenaglia Profilo | Guru

>-- qui mi da errore...
>update f1 set f1.id_cliente = f2.id_cliente from anag_clienti_b
>f1
> inner join (
> select id_cliente,remote_id from anag_clienti_b where stato
>= 0
> ) f2 on f2.remote_id = f1.remote_id
> where f1.stato = 1
>go

L'errore è semplice. Dai BOL: "SET IDENTITY_INSERT: Allows explicit values to be inserted into the identity column of a table" quindi vale esclusivamente per una operazione di INSERT.
Ad ogni modo faccio fatica a comprendere la logica di questo UPDATE.
Quali sono le righe della tabella anag_clienti_b che vorresti ottenere alla fine?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

massimo1965 Profilo | Junior Member

grazie Lorenzo....
in pratica sulla tabella anag_clienti_a non so quale campo è stato modificato quindi pensavo di caricare l'intero record, mantenendo sempre lo stesso id della tabella anag_clienti_b, perchè tramite la sua colonna id_cliente vi sono agganciate altre tabelle....

A questo punto penso di rivedere il tutto, nel senso di inserire le righe con l'id_cliente già valorizzato e di cancellare dopo quelle doppie...

Grazie comunque.

lbenaglia Profilo | Guru

>A questo punto penso di rivedere il tutto, nel senso di inserire
>le righe con l'id_cliente già valorizzato e di cancellare dopo
>quelle doppie...

Non ho ancora capito la logica di popolamento della tabella anag_clienti_b, ma hai considerato l'uso dei trigger?

>Grazie comunque.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

massimo1965 Profilo | Junior Member

grazie Lorenzo
il fatto è mi è un po' difficile spiegare quello che devo fare.
Ma parlandone forse ho capito quale altra strada prendere in funzione di quello che mi hai detto.

Grazie comunque
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5