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문을 사용할 수 없습니다.
를 참조해 주세요.ALTER TABLE구문 여기
여러 개 할 수 있습니다.ADD또는 복수DROP COLUMN단 1개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 - [Replace] 버튼을 클릭합니다.
- 검색:
스크립트를 실행합니다.
많은 시간을 절약할 수 있기를 바랍니다:)
다른 많은 사람들이 말했듯이, 여러 개를 사용해야 합니다.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각 컬럼에 대한 설명을 참조하십시오.
모든 열을 동일한 데이터 유형으로 변경하지 않으려면 다음과 같이 하십시오.
select 'alter table tblcommodityOHLC alter column '+name+ 'NUMERIC(18,0);'
from syscolumns where id = object_id('tblcommodityOHLC ')
출력을 복사하여 쿼리로 붙여넣을 수 있습니다.
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)
의탁의 예우
Evan의 코드 샘플 덕분에 더 수정하고 테이블에서 시작하는 특정 열 이름 및 제약 조건에 대한 세부 사항을 처리할 수 있었습니다.저는 그 코드를 실행하고 [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`;
쿼리는 쉼표로 구분하여 지정합니다.
언급URL : https://stackoverflow.com/questions/3465560/how-to-alter-multiple-columns-at-once-in-sql-server
'programing' 카테고리의 다른 글
| SNIReadSyncOverAsync 및 WaitForSingleObject가 EF 성능을 차단합니까? (0) | 2023.04.07 |
|---|---|
| SSMS에서 ntext 또는 nvarchar(최대)의 모든 텍스트를 어떻게 표시합니까? (0) | 2023.04.07 |
| C# var 키워드에 상당하는 VB.NET (0) | 2023.04.07 |
| 리액트 라우터가 aws s3 버킷에서 작동하지 않음 (0) | 2023.04.02 |
| Spring Boot 2로 업그레이드한 후 Object Mapper가 기본 컨스트럭터 없이 역직렬화할 수 없음 (0) | 2023.04.02 |