Ответ 1
Это невозможно. Вам нужно будет сделать это один за другим.
Вы можете создать временную таблицу с вашими измененными столбцами, скопировать данные, удалить исходную таблицу и переименовать временную таблицу в исходное имя.
Мне нужно ALTER
типы данных нескольких столбцов в таблице.
Для одного столбца выполняется следующее:
ALTER TABLE tblcommodityOHLC
ALTER COLUMN
CC_CommodityContractID NUMERIC(18,0)
Но как изменить несколько столбцов в одном выражении? Не работает следующее:
ALTER TABLE tblcommodityOHLC
ALTER COLUMN
CC_CommodityContractID NUMERIC(18,0),
CM_CommodityID NUMERIC(18,0)
Это невозможно. Вам нужно будет сделать это один за другим.
Вы можете создать временную таблицу с вашими измененными столбцами, скопировать данные, удалить исходную таблицу и переименовать временную таблицу в исходное имя.
Выполнение нескольких действий ALTER COLUMN
внутри одного оператора ALTER TABLE
невозможно.
Смотрите синтаксис ALTER TABLE
здесь
Вы можете сделать несколько ADD
или несколько DROP COLUMN
, но только один ALTER
COLUMN
.
Следующее решение - это не один оператор для изменения нескольких столбцов, но да, это делает жизнь простой:
Создать таблицу CREATE
script.
Замените CREATE TABLE
на ALTER TABLE [TableName] ALTER COLUMN
для первой строки
Удалите ненужные столбцы из списка.
Измените типы данных столбцов, которые вы хотите.
Выполните поиск и замену... следующим образом:
NULL
,NULL; ALTER TABLE [TableName] ALTER COLUMN
Запустите script.
Надеюсь, это сэкономит много времени:))
Как уже отвечали другие, вам нужно несколько утверждений ALTER TABLE
.
Попробуйте следующее:
ALTER TABLE tblcommodityOHLC alter column CC_CommodityContractID NUMERIC(18,0);
ALTER TABLE tblcommodityOHLC alter column CM_CommodityID NUMERIC(18,0);
Как и многие другие, вам нужно будет использовать несколько операторов ALTER COLUMN
, по одному для каждого столбца, который вы хотите изменить.
Если вы хотите изменить все или несколько столбцов в таблице на один и тот же тип данных (например, расширение поля VARCHAR от 50 до 100 символов), вы можете автоматически генерировать все утверждения, используя запрос ниже. Этот метод также полезен, если вы хотите заменить один и тот же символ в нескольких полях (например, удаление \t из всех столбцов).
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'
Это генерирует оператор ALTER TABLE
для каждого столбца для вас.
Если вы вносите изменения в студию управления и генерируете скрипты, она создает новую таблицу и вставляет старые данные в нее с измененными типами данных. Ниже приведен небольшой пример изменения двух типов данных столбцов
/*
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)
любезно предоставлено devio
Благодаря примеру кода Эвана я смог изменить его и сделать его более конкретным для таблиц, начиная с конкретных имен столбцов И обрабатывая особенности для ограничений. Я запустил этот код, а затем скопировал столбец [CODE] и выполнил его без проблем.
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'
Если вы не хотите сами писать все и менять все столбцы на один и тот же тип данных, это может упростить задачу:
select 'alter table tblcommodityOHLC alter column '+name+ 'NUMERIC(18,0);'
from syscolumns where id = object_id('tblcommodityOHLC ')
Вы можете скопировать и вставить вывод как ваш запрос
-- create temp table
CREATE TABLE temp_table_alter
(
column_name varchar(255)
);
-- insert those coulmns in temp table for which we nee to alter size of columns
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
-- at the end drop temp table
drop table temp_table_alter;
Мы можем изменить несколько столбцов в одном запросе следующим образом:
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';
Просто дайте запросы как разделенные запятой.
Если я правильно понял ваш вопрос, вы можете добавить несколько столбцов в таблицу, используя указанный ниже запрос.
Query:
Alter table tablename add (column1 dataype, column2 datatype);
Поместите инструкцию ALTER COLUMN
внутри скобки, она должна работать.
ALTER TABLE tblcommodityOHLC alter ( column
CC_CommodityContractID NUMERIC(18,0),
CM_CommodityID NUMERIC(18,0) )