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
'프로그램(잡탕)' 카테고리의 다른 글
서버 재부팅 이벤트 처리 방법. (0) | 2020.04.20 |
---|---|
An error occurred while applying security information to (0) | 2015.04.30 |