SQL Server에서 한 번에 여러 열을 변경하는 방법
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
명령문 내에서 여러 조치를 수행 할 수 없습니다.
여러 개 ADD
또는 여러 개를 할 수 DROP COLUMN
있지만 단 하나만 할 수 있습니다 ALTER COLUMN
.
다음 솔루션은 여러 열을 변경하는 단일 명령문이 아니지만 간단하게 수명을 연장합니다.
테이블의
CREATE
스크립트를 생성하십시오 .교체
CREATE TABLE
와 함께ALTER TABLE [TableName] ALTER COLUMN
첫 번째 줄에목록에서 원하지 않는 열을 제거하십시오.
원하는대로 열 데이터 유형을 변경하십시오.
다음과 같이 찾기 및 바꾸기… 를 수행하십시오 .
- 찾기 :
NULL
, - 다음으로 교체하십시오.
NULL; ALTER TABLE [TableName] ALTER COLUMN
- 히트 바꾸기 버튼을 클릭합니다.
- 찾기 :
스크립트를 실행하십시오.
그것이 많은 시간을 절약 할 수 있기를 바랍니다 :))
다른 사람들이 대답했듯이 여러 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
각 열에 대한 설명 이 생성됩니다 .
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 ' + 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의 의례
Thanks to Evan's code sample, I was able to modify it more and get it more specific to tables starting with, specific column names AND handle specifics for constraints too. I ran that code and then copied the [CODE] column and executed it without issue.
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'
If you don't want to write the whole thing yourself and change all the columns to the same datatype this can make it easier:
select 'alter table tblcommodityOHLC alter column '+name+ 'NUMERIC(18,0);'
from syscolumns where id = object_id('tblcommodityOHLC ')
You can copy and paste the output as your query
We can alter multiple columns in a single query like this:
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`;
Just give the queries as comma separated.
-- 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;
If i understood your question correctly you can add multiple columns in a table by using below mentioned query.
Query:
Alter table tablename add (column1 dataype, column2 datatype);
Put ALTER COLUMN
statement inside a bracket, it should work.
ALTER TABLE tblcommodityOHLC alter ( column
CC_CommodityContractID NUMERIC(18,0),
CM_CommodityID NUMERIC(18,0) )
참고URL : https://stackoverflow.com/questions/3465560/how-to-alter-multiple-columns-at-once-in-sql-server
'Programing' 카테고리의 다른 글
SQL 데이터베이스 디자인 초보자 가이드 (0) | 2020.07.09 |
---|---|
IntelliJ Idea의 프로젝트 트리에서 컴파일 오류를 즉시 보는 방법은 무엇입니까? (0) | 2020.07.09 |
'='의 의미는 무엇입니까? (0) | 2020.07.09 |
변수에 코드 할당 (0) | 2020.07.09 |
T-SQL에서 동등한 함수 분할? (0) | 2020.07.09 |