programing

SQL Server에서 여러 열을 동시에 변경하는 방법

iphone6s 2023. 4. 7. 20:59
반응형

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)

이건 불가능해.이걸 하나씩 해야 돼요.다음과 같은 것이 있습니다.

  1. 에서 변경된 컬럼을 사용하여 임시 테이블을 만듭니다.
  2. 데이터 복사
  3. 원래 테이블을 드롭합니다(이전에 더블체크!).
  4. 임시 테이블의 이름을 원래 이름으로 변경

복수 실행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);

다음 솔루션은 여러 열을 변경하기 위한 단일 문장이 아닙니다. 그러나 다음과 같이 하면 생활이 단순해집니다.

  1. 테이블 생성CREATE대본.

  2. 교체하다CREATE TABLE와 함께ALTER TABLE [TableName] ALTER COLUMN첫 번째 줄에 대해서

  3. 목록에서 불필요한 열을 제거합니다.

  4. 열 데이터 유형을 원하는 대로 변경합니다.

  5. 다음과 같이 검색 및 교환을 수행합니다.

    1. 검색:NULL,
    2. 대체 대상:NULL; ALTER TABLE [TableName] ALTER COLUMN
    3. [Replace] 버튼을 클릭합니다.
  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각 컬럼에 대한 설명을 참조하십시오.

모든 열을 동일한 데이터 유형으로 변경하지 않으려면 다음과 같이 하십시오.

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

반응형