[sql-server] 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있지만 단 하나만 수행 할 수 있습니다 ALTER
COLUMN
.


답변

다른 사람들이 대답했듯이 여러 ALTER TABLE진술 이 필요 합니다.
다음을 시도하십시오.

ALTER TABLE tblcommodityOHLC alter column CC_CommodityContractID NUMERIC(18,0);
ALTER TABLE tblcommodityOHLC alter column CM_CommodityID NUMERIC(18,0);


답변

다음 솔루션은 여러 열을 변경하는 단일 명령문이 아니지만 간단하게 수명을 연장합니다.

  1. 테이블의 CREATE스크립트를 생성하십시오 .

  2. 교체 CREATE TABLE와 함께 ALTER TABLE [TableName] ALTER COLUMN첫 번째 줄에

  3. 목록에서 원하지 않는 열을 제거하십시오.

  4. 원하는대로 열 데이터 유형을 변경하십시오.

  5. 다음과 같이 찾기 및 바꾸기… 를 수행하십시오 .

    1. 찾기 : NULL,
    2. 다음으로 교체하십시오. NULL; ALTER TABLE [TableName] ALTER COLUMN
    3. 히트 바꾸기 버튼을 클릭합니다.
  6. 스크립트를 실행하십시오.

많은 시간을 절약 할 수 있기를 바랍니다 :))


답변

다른 많은 사람들이 말했듯 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 ')

출력을 쿼리로 복사하여 붙여 넣을 수 있습니다