Discussione:
colonna Identity in sql server 2008
(troppo vecchio per rispondere)
ferradini
2010-05-04 07:32:08 UTC
Permalink
ALTER PROCEDURE sp_crea_tradizionali
AS



CREATE TABLE cTrad (
id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
nome VARCHAR(36),
esito CHAR(1) );


CREATE TABLE cTrad2 (
id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
id2 INT NOT NULL,
lunghetta VARCHAR(100),
rit SMALLINT,sto SMALLINT,frq SMALLINT, );



INSERT INTO cTrad VALUES(NULL,'esempi','A');

SELECT @@IDENTITY,id FROM cTrad
INSERT INTO cTrad2(id2, lunghetta)
VALUES(@@IDENTITY,'01.11.21.31.41.51.61.71.81');
INSERT INTO cTrad2(id2, lunghetta) VALUES(@@IDENTITY,
'02.12.22.32.42.52.62.72.82');
INSERT INTO cTrad2(id2, lunghetta) VALUES(@@IDENTITY,
'03.13.23.33.43.53.63.73.83');


Messaggio 8101, livello 16, stato 1, procedura sp_crea_tradizionali, riga 42
È possibile specificare un valore esplicito per la colonna Identity
nella tabella 'cTrad' solo quando si utilizza un elenco di colonne e
IDENTITY_INSERT ha valore ON.


Questo è l'errore ritornato.
Il problema è che non riesco a trovare come e dove scrivere l'attributo
ON della colonna Identity.
Come dovrei scrivere?
Grazie
Lorenzo Benaglia
2010-05-04 08:29:02 UTC
Permalink
Post by ferradini
Come dovrei scrivere?
Ciao,

Modifica

INSERT INTO cTrad VALUES(NULL,'esempi','A');

come

INSERT INTO cTrad VALUES('esempi','A');

Inoltre se esegui quel codice in una sp, ti suggerisco di utilizzare la
funzione SCOPE_IDENTITY() al posto di @@IDENTITY per recuperare il valore
generato dal precedente comando di INSERT in modo di essere certo di
"beccare" il valore corretto anche i presenza di triggers.
Post by ferradini
Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://social.microsoft.com/Forums/it-IT/sqlserverit
ferradini
2010-05-04 10:34:49 UTC
Permalink
ho seguito i tuoi suggerimenti e il tutto funziona se il codice è
eseguito come una query semplice, ma se inserisco CREATE PROC ecc...
e tento di memorizzarla ecco che mi esce l'errore riportato della mia mail.

"Messaggio 8101, livello 16, stato 1, procedura sp_crea_tradizionali,
riga 39
È possibile specificare un valore esplicito per la colonna Identity
nella tabella 'cTrad' solo quando si utilizza un elenco di colonne e
IDENTITY_INSERT ha valore ON."
Lorenzo Benaglia
2010-05-04 11:15:14 UTC
Permalink
ho seguito i tuoi suggerimenti e il tutto funziona se il codice è eseguito
come una query semplice, ma se inserisco CREATE PROC ecc...
e tento di memorizzarla ecco che mi esce l'errore riportato della mia mail.
Probabilmente l'errore è causato da qualcos'altro :-)
Posta un esempio completo con i comandi di CREATE TABLE, CREATE PROCEDURE,
INSERT INTO, ecc. in modo da riprodurre il problema.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://social.microsoft.com/Forums/it-IT/sqlserverit
Boccia
2010-05-04 15:38:04 UTC
Permalink
Ciao ,
questo è quello che ho fatto io:

CREATE PROCEDURE [dbo].[sp_crea_tradizionali]
AS
BEGIN TRANSACTION
CREATE TABLE cTrad (
id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
nome VARCHAR(36),
esito CHAR(1) );
CREATE TABLE cTrad2 (
id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
id2 INT NOT NULL,
lunghetta VARCHAR(100),
rit SMALLINT,sto SMALLINT,frq SMALLINT, );
INSERT INTO cTrad VALUES('esempi','A');
COMMIT TRANSACTION

e poi

drop table ctrad
drop table ctrad2
exec sp_crea_tradizionali

e tutto gira tranquillamente.
Non sono arrivato a fare l'insert sul ctrad2 (dici che il problema è
sulla ctrad1).
Ciao.
ferradini
2010-05-04 20:33:17 UTC
Permalink
IL tutto funziona adesso correttamente.
Il problema era che avevo mal interpretato il tuo suggerimento cioè di
eliminare il NULL.
Infatti continuavo a interpretare il messaggio di errore come qualcosa
riguardante la @@IDENTITY e non invece il voler attribuire alla mia
dichiarazione (errata) INSERT INTO cTrad VALUES(NULL,'esempi','A');
Mi scuso e grazie ancora ferradini

Loading...