2010-08-12 137 views
76

Necesito ALTER los tipos de datos de varias columnas en una tabla.Cómo ALTERAR varias columnas a la vez en SQL Server

Para una sola columna, las siguientes obras excelentes:

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

Pero, ¿cómo altero varias columnas en una declaración? Lo siguiente no funciona:

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

¿Cuál es la ventaja percibida de hacerlo de una vez? – onedaywhen

+3

@onedaywhen - Para que SQL Server simplemente haga una pasada a través de la tabla para hacer cualquier validación necesaria contra el nuevo tipo de datos y/o escribir las columnas alteradas en el nuevo formato. –

+0

¡No es una gran ventaja! – onedaywhen

Respuesta

84

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

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

+3

+1, 'Tendrá que hacer esto uno por uno. Entonces, ¿cuál es el problema, simplemente use varios comandos' ALTER TABLE ALTER COLUMN'? –

+2

@KM Un problema es si está alterando una gran mesa.Cada declaración significa un nuevo escaneo pero si puede modificar varias columnas, todas las modificaciones podrían haber sido mucho más rápidas – erikkallen

+0

@erikkallen, luego haga como las herramientas SSMS generalmente generan sus guiones: crear una nueva tabla y replicar FK e índices, etc., soltar la tabla original y luego cambie el nombre de la nueva tabla, –

1

Si realiza los cambios en el estudio de gestión y genera scripts, crea una nueva tabla e inserta los datos anteriores en los tipos de datos modificados. He aquí un pequeño ejemplo, cambiar dos tipos de datos de columna

/* 
    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 
15

Haciendo múltiples acciones ALTER COLUMN dentro de una única sentencia ALTER TABLE no es posible.

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

Puede hacerlo agregar múltiples o columna soltar múltiples, pero sólo un ALTER COLUMNA.

0
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

-3

Ponga ALTER COLUMN declaración dentro de un soporte, que debería funcionar.

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

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

  1. Generar guión de una mesa CREATE.

  2. Reemplazar CREATE TABLE con ALTER TABLE [TableName] ALTER COLUMN de primera línea

  3. eliminar columnas no deseados de la lista.

  4. Cambie los tipos de datos de las columnas como desee.

  5. realizar una búsqueda y reemplazar ... de la siguiente manera:

    1. Encontrar: NULL,
    2. Reemplazar con: NULL; ALTER TABLE [TableName] ALTER COLUMN
    3. Hit Reemplazar botón.
  6. Ejecute la secuencia de comandos.

Esperamos que se puede ahorrar mucho tiempo :))

-2

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

- insertar esos coulmns en tabla temporal para el que Nee para alterar 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 gota final tabla temporal tabla gota temp_table_alter;

+0

NO es una buena solución. Los cursores y los bucles deben evitarse CUALQUIER COSTO !!! –

+0

No es cierto, Ray. Los cursores y bucles están bien para ciertas tareas DDL y otras tareas necesariamente RBR. –

4

Como han respondido otros, necesita varias instrucciones ALTER TABLE. Proveedores:

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

etc.

0

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

Sólo dar las consultas, separados por comas.

-2

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

Consulta:

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

El OP preguntó acerca de la columna ALTER, no ADD. –

1

Como muchos otros han dicho, tendrá que utilizar múltiples ALTER COLUMN estados, uno para cada columna que desea 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 con 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.

Cuestiones relacionadas