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
답변
다른 사람들이 대답했듯이 여러 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 ')
출력을 쿼리로 복사하여 붙여 넣을 수 있습니다