SQL Server 데이터 정렬을 변경하는 방법


27

전체 서버와 특정 데이터베이스에 대한 SQL Server 2008 R2 Express 기본 데이터 정렬을 어떻게 변경할 수 있습니까?

SQL Server Management Studio의 시각적 인터페이스를 사용하여 수행 할 수있는 방법이 있습니까? 서버 특성 창 및 해당 데이터베이스 특성 창에서이 특성을 편집 할 수 없습니다.


2
데이터베이스의 모든 열 데이터 정렬을 변경하려면 이 스크립트를보십시오 . 나는 그것을 직접 시도하지는 않았지만, 그렇게하려는 동료를 위해 그것을 찾았습니다.
저스틴 친애하는

2
데이터베이스의 데이터 정렬을 변경하려면 다음 도구를 확인하십시오. codeproject.com/KB/database/ChangeCollation.aspx SQL Server 2005 및 2008에서 작동하며 편물.
Erwin

답변:


25

예.

SQL Server 2008 R2 Express 인스턴스와 개별 데이터베이스의 기본 데이터 정렬을 변경할 수 있지만 복잡한 작업입니다.

안타깝게도 SSMS를 통해 시각적 옵션이 없습니다.

SQL Server 2008은 다음 수준에서 데이터 정렬 설정을 지원합니다.

  • 섬기는 사람

  • 데이터 베이스

  • 기둥

  • 표현

기본 설치 설정은 Windows 시스템 로케일에 의해 결정됩니다. 서버 수준 데이터 정렬은 설치 중 또는 설치 전에 Windows 시스템 로캘을 변경하여 변경할 수 있습니다. 더...

서버 데이터 정렬 설정 및 변경-SQL Server 2008

  • 사용자 데이터베이스 및 데이터베이스의 모든 오브젝트를 다시 작성하는 데 필요한 모든 정보 또는 스크립트가 있는지 확인하십시오.

  • bcp 유틸리티와 같은 도구를 사용하여 모든 데이터를 내 보냅니다. 자세한 내용은 벌크 데이터 가져 오기 및 내보내기를 참조하십시오.

  • 모든 사용자 데이터베이스를 삭제하십시오.

  • setup 명령의 SQLCOLLATION 특성에서 새 데이터 정렬을 지정 하여 마스터 데이터베이스다시 빌드하십시오.

  • 모든 데이터베이스와 데이터베이스의 모든 오브젝트를 작성하십시오.

  • 모든 데이터를 가져옵니다.

데이터베이스 데이터 정렬 설정 및 변경-SQL Server 2008

  • 새 데이터베이스를 작성하는 동안 명령문 에서 COLLATION옵션을 설정하십시오 CREATE DATABASE.
  • 마찬가지로, 명령문 에서 COLLATION옵션을 설정하여 ALTER DATABASE기존 데이터베이스의 데이터 정렬을 변경하십시오.

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

열 데이터 정렬 및 설정

  • 데이터베이스 데이터 정렬을 변경 한 후에도 일부 열 데이터 정렬은 동일하게 유지됩니다. 이 경우 개별 열의 데이터 정렬을 수정해야합니다.

6

위의 답변에서 언급 한대로 사용자 데이터베이스를 "삭제"해야합니다. 데이터베이스를 "분리"할 수도 있습니다. 또는 실제로 마스터를 다시 작성하면 사용자 데이터베이스에 대한 링크가 효과적으로 제거되므로 아무 것도 할 수 없습니다. 데이터베이스가 원하는 데이터 정렬에서 작성되지만 서버는 생성되지 않는 경우가 있습니다. 이 경우 백업에서 모든 사용자 데이터베이스를 복구하지 않아도됩니다.


5

나는 이와 같은 일을했는데 효과가 있었지만 text / varchar / nvarchar와 같이 데이터 유형을 가리키는 색인을 삭제하고 스크립트를 실행 한 다음 색인을 작성해야한다는 것을 명심해야합니다.

USE YourDataBase
GO

DECLARE @Table_Name NVARCHAR(100)
SET @Table_Name = NULL--- THIS IS THE TableName that you want to change its collation columns

--- if null will set to all tables

DECLARE @TempTable AS TABLE
(
ID INT IDENTITY
,TableName NVARCHAR(100)
,ColumnName NVARCHAR(100)
,TypeName NVARCHAR(100)
,Max_length INT
,Collation_Name NVARCHAR(100)
,EnterDtm DATETIME DEFAULT GETDATE()
)
DECLARE @NewCollation NVARCHAR(100)
SET @NewCollation = 'Latin1_General_CI_AS' --- THIS IS THE COLLATION NAME THAT YOU WANT TO CHANGE

INSERT INTO @TempTable(TableName,ColumnName,TypeName,Max_length,Collation_Name)
SELECT 
QUOTENAME(SCHEMA_NAME(tables.schema_id)) + '.' + QUOTENAME(tables.name) AS TableName
,all_columns.name AS ColumnName
,type_name(all_columns.user_type_id)
,all_columns.max_length
,all_columns.collation_name  
from sys.all_columns INNER JOIN sys.tables ON
tables.object_id = all_columns.object_id
AND collation_name IS NOT NULL
AND all_columns.collation_name != @NewCollation
WHERE tables.object_id = ISNULL(object_id(@Table_Name),all_columns.object_id)


DECLARE @TableID SMALLINT
SET @TableID = (SELECT MIN(ID) FROM @TempTable)

DECLARE @Query NVARCHAR(1000),@TableName NVARCHAR(100),@ColumnName NVARCHAR(100),@TypeName NVARCHAR(100)
,@Size INT

WHILE @TableID IS NOT NULL
BEGIN
    SET @TableName = (SELECT TableName FROM @TempTable WHERE ID = @TableID)
    SET @ColumnName = (SELECT QUOTENAME(ColumnName) FROM @TempTable WHERE ID = @TableID)
    SET @TypeName = (SELECT TypeName FROM @TempTable WHERE ID = @TableID)
    SET @Size = (SELECT Max_length FROM @TempTable WHERE ID = @TableID) 

    SET @Query='ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @ColumnName + ' ' + @TypeName+ ISNULL ('(' +CAST(@Size AS VARCHAR(200))+')', '') +' COLLATE '+ @NewCollation  
    PRINT (@Query)

    SET @TableID = (SELECT MIN(ID) FROM @TempTable WHERE ID > @TableID)
END 

이것은 내 첫 번째 답변입니다.


-1

모든 데이터 (로그인, 연결된 서버, SQL 에이전트 작업, DB 메일 설정 등) 내보내고 인스턴스 수준 데이터를 다시 작성하고 모든 사용자 데이터를 다시로드 하는 것은 많은 작업입니다. 그리고 그 후에도 ALTER DATABASE작업이 완료되지 못하게하는 몇 가지 조건이 있기 때문에 데이터베이스의 기본 데이터 정렬을 업데이트 할 수 있다는 보장은 없습니다 (자세한 내용 ALTER DATABASE설명서 의 "데이터베이스 정렬 변경"섹션 참조). .

그러나 문서화되지 않은 방법이 훨씬 더 쉽습니다. 주요 단점은 지원되지 않는다는 것입니다. 이것은 문제가 발생한다고 말하는 것이 아닙니다. 문제가 발생하면 Microsoft는 문제를 해결하는 데 도움이되지 않습니다 (작동하지 않을 것이라고 보장하지 않기 때문에).

내가 말한 방법 sqlservr.exe-q {new_collation_name}스위치 로 실행 중 입니다 . 그것보다 조금 더 있지만 기본 아이디어입니다. 이 방법은 단순히 시스템 메타 데이터를 업데이트하는데, 이는 다음과 같은 주요 이점과 결과가 있습니다.

은혜

  • 꽤 빠른
  • ALTER DATABASE작동 을 방해하는 대부분의 제한을 우회
  • 사람들이 객체를 삭제하고 다시 만들기 위해 수년 동안 생각해온 스크립트보다 훨씬 더 정확할 것입니다.

결점

  • 문제가 발생하면 지원되지 않습니다
  • VARCHAR데이터 의 코드 페이지 신구 정렬과 다르다시 변경 255 (0x80으로 - - 0xFF로) (128)의 값을 가진 자 존재 하고 해당 문자가 새로운 코드 값이 동일한 동일 자로없는 페이지. 따라서 데이터 손실 가능성이 있으며이 조건이 존재하지 않도록 데이터를 먼저 조사해야합니다. 그러나 이것은 또한 코드 페이지가 변경 되더라도 0-127의 값을 가진 문자 있으면 위험하지 않은 많은 경우가 있음을 의미합니다 .
  • UDTT (User-Defined Table Types)는 건너 뛰므로 수동으로 업데이트해야합니다.

sqlservr.exe -q방법이 수행하고 수행하지 않는 작업에 대한 자세한 설명 (다양한 수준에서 데이터 정렬이 작동하는 방법 및주의해야 할 잠재적 인 문제에 대한 세부 정보 포함)은 다음 게시물을 참조하십시오.

모든 사용자 데이터베이스에서 인스턴스, 데이터베이스 및 모든 열의 데이터 정렬 변경 : 무엇이 잘못 될 수 있습니까?

(시스템 데이터베이스를 포함 : 전용 인스턴스를 변경하려면 master, model, msdb,과 tempdb) 및 하나 개 이상의 데이터베이스 (그러나 모든 데이터베이스), 간단하게이 작업에서 제외 할 것을 데이터베이스 (들)을 분리 한 다음 전원을 다시 연결 데이터 정렬 업데이트가 완료되면

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.