SQL 2008

20/10/2008 - 15:30 por Maria | Informe spam
Hola,
Estoy trabajando con SQL 2008, tengo una duda:
Estoy creando una nueva tabla, defino sun columnas y la salvo. REviso
la definición y me doy cuenta que me he olvidado poner el atributo
Identity en la columna que es Primay Key. Lo modifico y cuando voy a
guardar los cambios tengo un mensaje diciendo que no puedo realizar la
modificación en la tabla, que tengo que borrarla y volver a crearla
No entiendo por que si la tabla esta vacia, tengo que borrarla...
Alguien sabe si es por que me falta algo por configurar o es una
"mejora" del 2008??

Gracias

Preguntas similare

Leer las respuestas

#6 Leonardo Azpurua
21/10/2008 - 05:49 | Informe spam
"Maxi" escribió en el mensaje
news:%
Maria, por TSQL jamas se puedo agregar un identity a un campo existente,
siempre habia que borrar la tabla y volverla a crear.
Es solo una notificacion o no te deja avanzar?



Hola, Maxi

¿No sería suficiente borrar la columna?

Borrar la tabla es un poco extremo, digo yo.

Salud!
Respuesta Responder a este mensaje
#7 Maxi Accotto
22/10/2008 - 02:58 | Informe spam
Hola, no se puede Leo, si una columna no es identity y la definis luego como
tal es necesario crear una tabla nueva pasar los datos borrar la existente y
por ultimo renombrarla.

Aqui te paso el codigo TSQL que se genera al solo hecho de indicarle a una
columna que existia en una tabla que es identity

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_EMPLEADOS
(
ID int NOT NULL IDENTITY (1, 1),
NAME varchar(50) NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_EMPLEADOS SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_EMPLEADOS ON
GO
IF EXISTS(SELECT * FROM dbo.EMPLEADOS)
EXEC('INSERT INTO dbo.Tmp_EMPLEADOS (ID, NAME)
SELECT ID, NAME FROM dbo.EMPLEADOS WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_EMPLEADOS OFF
GO
DROP TABLE dbo.EMPLEADOS
GO
EXECUTE sp_rename N'dbo.Tmp_EMPLEADOS', N'EMPLEADOS', 'OBJECT'
GO
COMMIT



Saludos
Maxi Accotto
Microsoft MVP en SQLServer
SQltotalconsulting
-

"Leonardo Azpurua" <l e o n a r d o [arroba] m v p s [punto] o r g> escribió
en el mensaje de noticias:

"Maxi" escribió en el mensaje
news:%
Maria, por TSQL jamas se puedo agregar un identity a un campo existente,
siempre habia que borrar la tabla y volverla a crear.
Es solo una notificacion o no te deja avanzar?



Hola, Maxi

¿No sería suficiente borrar la columna?

Borrar la tabla es un poco extremo, digo yo.

Salud!


Respuesta Responder a este mensaje
#8 Leonardo Azpurua
22/10/2008 - 03:13 | Informe spam
"Maxi Accotto" escribió en el mensaje
news:%
Hola, no se puede Leo, si una columna no es identity y la definis luego
como tal es necesario crear una tabla nueva pasar los datos borrar la
existente y por ultimo renombrarla.

Aqui te paso el codigo TSQL que se genera al solo hecho de indicarle a una
columna que existia en una tabla que es identity

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_EMPLEADOS
(
ID int NOT NULL IDENTITY (1, 1),
NAME varchar(50) NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_EMPLEADOS SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_EMPLEADOS ON
GO
IF EXISTS(SELECT * FROM dbo.EMPLEADOS)
EXEC('INSERT INTO dbo.Tmp_EMPLEADOS (ID, NAME)
SELECT ID, NAME FROM dbo.EMPLEADOS WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_EMPLEADOS OFF
GO
DROP TABLE dbo.EMPLEADOS
GO
EXECUTE sp_rename N'dbo.Tmp_EMPLEADOS', N'EMPLEADOS', 'OBJECT'
GO
COMMIT




Hola,

Está claro que no puedes convertir en IDENTITY una columna existente.

Lo que digo es que BORRAR TODA LA TABLA es una BURRADA: puedes hacer algo
tan simple como:

alter table Z drop column X
alter table Z add X int identity (1, 1)

es decir, eliminar la columna mal definida y definirla correctamente.

Y eso puede hacerse incluso si la tabla tiene datos.

Espero haberme explicado mejor :-)


Salud!
Respuesta Responder a este mensaje
#9 Leonardo Azpurua
22/10/2008 - 13:58 | Informe spam
"Maxi Accotto" escribió en el mensaje
news:
Si Leo te explicas y estas en lo correcto, lo que suecede que el ALter no
soporta eso, o sea no puedes via alter asignar un identity, por eso tiene
que hacer todo lo otro.



Hola, Maxi

Creo que estamos discutiendo cosas diferentes.

Con lo que no estoy de acuerdo es con la afirmación de que hay que borrar la
tabla. Recuerda que el mensaje original indicaba que la tabla en cuestión no
contiene datos.

De todas maneras, la discusión es un poco insensata. Corregir un error en el
diseño de la BD es una cosa que puede hacerse en segundos usando un programa
de administración.


Salud!
Respuesta Responder a este mensaje
#10 Maxi Accotto
22/10/2008 - 14:17 | Informe spam
Si Leo te explicas y estas en lo correcto, lo que suecede que el ALter no
soporta eso, o sea no puedes via alter asignar un identity, por eso tiene
que hacer todo lo otro.



Saludos
Maxi Accotto
Microsoft MVP en SQLServer
SQltotalconsulting
-

"Leonardo Azpurua" <l e o n a r d o [arroba] m v p s [punto] o r g> escribió
en el mensaje de noticias:OT6MeO#

"Maxi Accotto" escribió en el mensaje
news:%
Hola, no se puede Leo, si una columna no es identity y la definis luego
como tal es necesario crear una tabla nueva pasar los datos borrar la
existente y por ultimo renombrarla.

Aqui te paso el codigo TSQL que se genera al solo hecho de indicarle a
una columna que existia en una tabla que es identity

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_EMPLEADOS
(
ID int NOT NULL IDENTITY (1, 1),
NAME varchar(50) NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_EMPLEADOS SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_EMPLEADOS ON
GO
IF EXISTS(SELECT * FROM dbo.EMPLEADOS)
EXEC('INSERT INTO dbo.Tmp_EMPLEADOS (ID, NAME)
SELECT ID, NAME FROM dbo.EMPLEADOS WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_EMPLEADOS OFF
GO
DROP TABLE dbo.EMPLEADOS
GO
EXECUTE sp_rename N'dbo.Tmp_EMPLEADOS', N'EMPLEADOS', 'OBJECT'
GO
COMMIT




Hola,

Está claro que no puedes convertir en IDENTITY una columna existente.

Lo que digo es que BORRAR TODA LA TABLA es una BURRADA: puedes hacer algo
tan simple como:

alter table Z drop column X
alter table Z add X int identity (1, 1)

es decir, eliminar la columna mal definida y definirla correctamente.

Y eso puede hacerse incluso si la tabla tiene datos.

Espero haberme explicado mejor :-)


Salud!


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida