update type nombre modificar drop columna column change cambiar sql-server tsql alter-column

sql-server - type - rename table sql server



Cómo ALTERAR múltiples columnas a la vez en SQL Server (12)

- crear tabla temporal CREATE TABLE temp_table_alter (column_name varchar (255)
);

- inserte los puntos en la tabla temporal para los cuales necesitamos cambiar el tamaño de las columnas

INSERT INTO temp_table_alter (column_name) VALUES (''colm1''); INSERT INTO temp_table_alter (column_name) VALUES (''colm2''); INSERT INTO temp_table_alter (column_name) VALUES (''colm3''); INSERT INTO temp_table_alter (column_name) VALUES (''colm4''); DECLARE @col_name_var varchar(255); DECLARE alter_table_cursor CURSOR FOR select column_name from temp_table_alter ; OPEN alter_table_cursor FETCH NEXT FROM alter_table_cursor INTO @col_name_var WHILE @@FETCH_STATUS = 0 BEGIN PRINT(''ALTER COLUMN '' + @col_name_var); EXEC (''ALTER TABLE Original-table ALTER COLUMN [''+ @col_name_var + ''] DECIMAL(11,2);'') FETCH NEXT FROM alter_table_cursor INTO @col_name_var END CLOSE alter_table_cursor

DEALLOCATE alter_table_cursor

- en la tabla de caída de tabla temporal drop temp_table_alter;

Necesito ALTER los tipos de datos de varias columnas en una tabla.

Para una sola columna, lo siguiente funciona bien:

ALTER TABLE tblcommodityOHLC ALTER COLUMN CC_CommodityContractID NUMERIC(18,0)

¿Pero cómo modifico múltiples columnas en una declaración? Lo siguiente no funciona:

ALTER TABLE tblcommodityOHLC ALTER COLUMN CC_CommodityContractID NUMERIC(18,0), CM_CommodityID NUMERIC(18,0)


Como muchos otros han dicho, necesitarás usar varias sentencias ALTER COLUMN , una para cada columna que quieras modificar.

Si desea modificar todas o varias de las columnas de su tabla al mismo tipo de datos (como expandir un campo VARCHAR de 50 a 100 caracteres), puede generar todas las declaraciones automáticamente mediante la consulta siguiente. Esta técnica también es útil si desea reemplazar el mismo carácter en múltiples campos (como eliminar / t de todas las columnas).

SELECT TABLE_CATALOG ,TABLE_SCHEMA ,TABLE_NAME ,COLUMN_NAME ,''ALTER TABLE [''+TABLE_SCHEMA+''].[''+TABLE_NAME+''] ALTER COLUMN [''+COLUMN_NAME+''] VARCHAR(300)'' as ''code'' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''your_table'' AND TABLE_SCHEMA = ''your_schema''

Esto genera una declaración ALTER TABLE para cada columna por usted.


Como otros han respondido, necesita múltiples instrucciones ALTER TABLE. Tratar:

ALTER TABLE tblcommodityOHLC alter column CC_CommodityContractID NUMERIC(18,0); ALTER TABLE tblcommodityOHLC alter column CM_CommodityID NUMERIC(18,0);

etc.


Esto no es posible. Tendrá que hacer esto uno por uno.

Podría crear una Tabla temporal con sus columnas modificadas, copiar los datos, colocar su tabla original y cambiar el nombre de su Tabla temporal por su nombre original.


Gracias al ejemplo del código de Evan, pude modificarlo más y hacerlo más específico para las tablas que comienzan con nombres de columna específicos Y manejar detalles específicos para las restricciones también. Ejecuté ese código y luego copié la columna [CÓDIGO] y lo ejecuté sin problema.

USE [Table_Name] GO SELECT TABLE_CATALOG ,TABLE_SCHEMA ,TABLE_NAME ,COLUMN_NAME ,DATA_TYPE ,''ALTER TABLE [''+TABLE_SCHEMA+''].[''+TABLE_NAME+''] DROP CONSTRAINT [DEFAULT_''+TABLE_NAME+''_''+COLUMN_NAME+'']; ALTER TABLE [''+TABLE_SCHEMA+''].[''+TABLE_NAME+''] ALTER COLUMN [''+COLUMN_NAME+''] datetime2 (7) NOT NULL ALTER TABLE [''+TABLE_SCHEMA+''].[''+TABLE_NAME+''] ADD CONSTRAINT [DEFAULT_''+TABLE_NAME+''_''+COLUMN_NAME+''] DEFAULT (''''3/6/2018 6:47:23 PM'''') FOR [''+COLUMN_NAME+'']; GO'' AS ''[CODE]'' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME LIKE ''form_%'' AND TABLE_SCHEMA = ''dbo'' AND (COLUMN_NAME = ''FormInserted'' OR COLUMN_NAME = ''FormUpdated'') AND DATA_TYPE = ''datetime''


La siguiente solución no es una sola declaración para alterar varias columnas, pero sí, hace la vida más sencilla:

  1. Genera el script CREATE una tabla.

  2. Reemplace CREATE TABLE con ALTER TABLE [TableName] ALTER COLUMN para primera línea

  3. Eliminar columnas no deseadas de la lista.

  4. Cambia los tipos de datos de las columnas como quieras.

  5. Realice una búsqueda y reemplazo ... de la siguiente manera:

    1. Buscar: NULL ,
    2. Reemplace con: NULL; ALTER TABLE [TableName] ALTER COLUMN NULL; ALTER TABLE [TableName] ALTER COLUMN
    3. Presione el botón Reemplazar .
  6. Ejecute el script

Espero que ahorrará mucho tiempo :))


No es posible realizar varias acciones ALTER COLUMN dentro de una sola instrucción ALTER TABLE.

Vea la sintaxis ALTER TABLE aquí:
http://msdn.microsoft.com/en-US/library/ms190273.aspx

Puedes hacer ADD múltiple o COLUMNA DE GOTAS múltiples, pero solo una COLUMNA DE ALTERACIÓN.


Podemos alterar varias columnas en una sola consulta como esta:

ALTER TABLE `tblcommodityOHLC` CHANGE COLUMN `updated_on` `updated_on` DATETIME NULL DEFAULT NULL AFTER `updated_by`, CHANGE COLUMN `delivery_datetime` `delivery_datetime` DATETIME NULL DEFAULT CURRENT_TIMESTAMP AFTER `delivery_status`;

Solo da las consultas como separadas por comas.


Ponga la instrucción ALTER COLUMN dentro de un corchete, debería funcionar.

ALTER TABLE tblcommodityOHLC alter ( column CC_CommodityContractID NUMERIC(18,0), CM_CommodityID NUMERIC(18,0) )


Si entendí su pregunta correctamente, puede agregar varias columnas en una tabla usando la consulta mencionada a continuación.

Consulta:

Alter table tablename add (column1 dataype, column2 datatype);


Si realiza los cambios en el estudio de gestión y genera scripts, crea una nueva tabla e inserta los datos antiguos en ese con los tipos de datos modificados. Aquí hay un pequeño ejemplo que cambia los tipos de datos de dos columnas

/* 12 August 201008:30:39 User: Server: CLPPRGRTEL01/TELSQLEXPRESS Database: Tracker_3 Application: */ /* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/ 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 ALTER TABLE dbo.tblDiary DROP CONSTRAINT FK_tblDiary_tblDiary_events GO ALTER TABLE dbo.tblDiary_events SET (LOCK_ESCALATION = TABLE) GO COMMIT BEGIN TRANSACTION GO CREATE TABLE dbo.Tmp_tblDiary ( Diary_ID int NOT NULL IDENTITY (1, 1), Date date NOT NULL, Diary_event_type_ID int NOT NULL, Notes varchar(MAX) NULL, Expected_call_volumes real NULL, Expected_duration real NULL, Skill_affected smallint NULL ) ON T3_Data_2 TEXTIMAGE_ON T3_Data_2 GO ALTER TABLE dbo.Tmp_tblDiary SET (LOCK_ESCALATION = TABLE) GO SET IDENTITY_INSERT dbo.Tmp_tblDiary ON GO IF EXISTS(SELECT * FROM dbo.tblDiary) EXEC(''INSERT INTO dbo.Tmp_tblDiary (Diary_ID, Date, Diary_event_type_ID, Notes, Expected_call_volumes, Expected_duration, Skill_affected) SELECT Diary_ID, Date, Diary_event_type_ID, CONVERT(varchar(MAX), Notes), Expected_call_volumes, Expected_duration, CONVERT(smallint, Skill_affected) FROM dbo.tblDiary WITH (HOLDLOCK TABLOCKX)'') GO SET IDENTITY_INSERT dbo.Tmp_tblDiary OFF GO DROP TABLE dbo.tblDiary GO EXECUTE sp_rename N''dbo.Tmp_tblDiary'', N''tblDiary'', ''OBJECT'' GO ALTER TABLE dbo.tblDiary ADD CONSTRAINT PK_tblDiary PRIMARY KEY NONCLUSTERED ( Diary_ID ) WITH( PAD_INDEX = OFF, FILLFACTOR = 86, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON T3_Data_2 GO CREATE UNIQUE CLUSTERED INDEX tblDiary_ID ON dbo.tblDiary ( Diary_ID ) WITH( PAD_INDEX = OFF, FILLFACTOR = 86, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON T3_Data_2 GO CREATE NONCLUSTERED INDEX tblDiary_date ON dbo.tblDiary ( Date ) WITH( PAD_INDEX = OFF, FILLFACTOR = 86, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON T3_Data_2 GO ALTER TABLE dbo.tblDiary WITH NOCHECK ADD CONSTRAINT FK_tblDiary_tblDiary_events FOREIGN KEY ( Diary_event_type_ID ) REFERENCES dbo.tblDiary_events ( Diary_event_ID ) ON UPDATE CASCADE ON DELETE CASCADE GO COMMIT


select ''ALTER TABLE '' + OBJECT_NAME(o.object_id) + '' ALTER COLUMN '' + c.name + '' DATETIME2 '' + CASE WHEN c.is_nullable = 0 THEN ''NOT NULL'' ELSE ''NULL'' END from sys.objects o inner join sys.columns c on o.object_id = c.object_id inner join sys.types t on c.system_type_id = t.system_type_id where o.type=''U'' and c.name = ''Timestamp'' and t.name = ''datetime'' order by OBJECT_NAME(o.object_id)

cortesía de devio