Мне нужны 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)
sql-server
tsql
alter-column
Д.махеш
источник
источник
Ответы:
Это невозможно . Вам нужно будет делать это по одному. Ты мог бы:
источник
You will need to do this one by one.
так что в этом такого, просто использовать несколькоALTER TABLE ALTER COLUMN
команд?"Each statement means a new scan"
: Не обязательно @erikkallen. В некоторых случаях столбец ALTER - это простое изменение метаданных. Приглашаем вас присоединиться к моей лекции завтра о "SQL Internals - Physical Table Structure under the hood, and implementation on real case scenarios
", чтобы увидеть все это на практике :-)Выполнение нескольких
ALTER COLUMN
действий внутри одногоALTER TABLE
оператора невозможно.Смотрите
ALTER TABLE
синтаксис здесьВы можете делать несколько
ADD
или несколькоDROP COLUMN
, но только одинALTER COLUMN
.источник
Как ответили другие, вам нужно несколько
ALTER TABLE
утверждений.Попробуйте следующее:
ALTER TABLE tblcommodityOHLC alter column CC_CommodityContractID NUMERIC(18,0); ALTER TABLE tblcommodityOHLC alter column CM_CommodityID NUMERIC(18,0);
источник
Следующее решение не является одним оператором для изменения нескольких столбцов, но да, оно упрощает жизнь:
Сгенерируйте
CREATE
скрипт таблицы .Заменить
CREATE TABLE
сALTER TABLE [TableName] ALTER COLUMN
на первой линииУдалите ненужные столбцы из списка.
Измените типы данных столбцов по своему усмотрению.
Выполните поиск и замену… следующим образом:
NULL
,NULL; ALTER TABLE [TableName] ALTER COLUMN
Запускаем скрипт.
Надеюсь, это сэкономит много времени :))
источник
Как говорили многие другие, вам нужно будет использовать несколько
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
для вас отчет для каждого столбца.источник
Если вы вносите изменения в Management Studio и генерируете сценарии, она создает новую таблицу и вставляет в нее старые данные с измененными типами данных. Вот небольшой пример изменения типа данных двух столбцов
/* 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 tblcommodityOHLC alter column '+name+ 'NUMERIC(18,0);' from syscolumns where id = object_id('tblcommodityOHLC ')
Вы можете скопировать и вставить результат как свой запрос
источник
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)
источник
Благодаря образцу кода Эвана я смог изменить его больше и сделать его более конкретным для таблиц, начинающихся с определенных имен столбцов, И также обрабатывать специфические особенности для ограничений. Я запустил этот код, а затем скопировал столбец [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'
источник
-- 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 COLUMN
оператор в скобки, он должен работать.ALTER TABLE tblcommodityOHLC alter ( column CC_CommodityContractID NUMERIC(18,0), CM_CommodityID NUMERIC(18,0) )
источник
Если я правильно понял ваш вопрос, вы можете добавить несколько столбцов в таблицу, используя указанный ниже запрос.
Запрос:
Alter table tablename add (column1 dataype, column2 datatype);
источник
Мы можем изменить несколько столбцов в одном запросе следующим образом:
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`;
Просто задавайте запросы через запятую.
источник