본문 바로가기

프로그램(잡탕)

MS SQL 컬럼 일괄변경

2020-04-24 

 

주제 : VARHCHAR를 NVARCHAR로 바꾸고 싶다.

 

정말 어이없게 간단할 것으로 생각하고, 원래 시작은 간단할 것이라는 착각 속에서 시작이었다.

프로그램 구현을 하다 보니, 유니코드 지원이 많이 필요한 상태여서 VARCHAR를 바꾸고 싶었던 것이다.

 

그런데, 미쳐 생각지 못한 부분이 PK,FK,IX 등등의 속성을 가지고 있는 경우에는 아래 구문을 실행하면 에러가 뜨는 것이다. 물론, 디자이너에서 한땀 한땀 바꿔주면 되긴 된다. 나는 그걸 원하는 게 아니었다.

 

/* 구문을 실행해봤는데, 에러가 나왔다. */

 DECLARE @TableName nvarchar(500) 
 DECLARE @ColumnName nvarchar(500) 
 DECLARE @DataType nvarchar(500) 
 DECLARE @TypeSize INT 
 DECLARE @IS_NULLABLE nvarchar(500) 

 DECLARE Cur CURSOR FOR
 SELECT a.name TableName, b.column_name ColumnName, b.data_type DataType, b.CHARACTER_MAXIMUM_LENGTH TypeSize, (case when IS_NULLABLE = 'YES' then 'null' else 'not null' end) IS_NULLABLE
 FROM sysobjects a
 INNER JOIN information_schema.columns b ON a.name = b.table_name AND a.type='U'
 WHERE b.data_type = 'varchar'
 AND b.CHARACTER_MAXIMUM_LENGTH <> -1
 OPEN Cur 
 FETCH NEXT FROM Cur INTO @TableName,@ColumnName, @DataType, @TypeSize, @IS_NULLABLE
 WHILE @@FETCH_STATUS =0
 BEGIN   
    DECLARE @SQLStmt VARCHAR(500) ='ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @ColumnName + '   NVARCHAR('+ convert(varchar, @TypeSize) +')' + @IS_NULLABLE

   EXEC(@SQLStmt)
  FETCH NEXT FROM Cur INTO @TableName,@ColumnName, @DataType, @TypeSize, @IS_NULLABLE
 END 
 CLOSE Cur
 DEALLOCATE  Cur 

 

더 찾아보니, 

FK, PK, IX drop constraint를 해야 하는 것이었는데, 이것도 한번에 삭제 처리가 되지 않았다. 

 

오늘은 여기까지만 2020-04-24