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:
Genera el script
CREATE
una tabla.Reemplace
CREATE TABLE
conALTER TABLE [TableName] ALTER COLUMN
para primera líneaEliminar columnas no deseadas de la lista.
Cambia los tipos de datos de las columnas como quieras.
Realice una búsqueda y reemplazo ... de la siguiente manera:
- Buscar:
NULL
, - Reemplace con:
NULL; ALTER TABLE [TableName] ALTER COLUMN
NULL; ALTER TABLE [TableName] ALTER COLUMN
- Presione el botón Reemplazar .
- Buscar:
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