전체 서버와 특정 데이터베이스에 대한 SQL Server 2008 R2 Express 기본 데이터 정렬을 어떻게 변경할 수 있습니까?
SQL Server Management Studio의 시각적 인터페이스를 사용하여 수행 할 수있는 방법이 있습니까? 서버 특성 창 및 해당 데이터베이스 특성 창에서이 특성을 편집 할 수 없습니다.
전체 서버와 특정 데이터베이스에 대한 SQL Server 2008 R2 Express 기본 데이터 정렬을 어떻게 변경할 수 있습니까?
SQL Server Management Studio의 시각적 인터페이스를 사용하여 수행 할 수있는 방법이 있습니까? 서버 특성 창 및 해당 데이터베이스 특성 창에서이 특성을 편집 할 수 없습니다.
답변:
예.
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;
나는 이와 같은 일을했는데 효과가 있었지만 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
이것은 내 첫 번째 답변입니다.
모든 데이터 (로그인, 연결된 서버, SQL 에이전트 작업, DB 메일 설정 등) 를 내보내고 인스턴스 수준 데이터를 다시 작성하고 모든 사용자 데이터를 다시로드 하는 것은 많은 작업입니다. 그리고 그 후에도 ALTER DATABASE
작업이 완료되지 못하게하는 몇 가지 조건이 있기 때문에 데이터베이스의 기본 데이터 정렬을 업데이트 할 수 있다는 보장은 없습니다 (자세한 내용 은 ALTER DATABASE
설명서 의 "데이터베이스 정렬 변경"섹션 참조). .
그러나 문서화되지 않은 방법이 훨씬 더 쉽습니다. 주요 단점은 지원되지 않는다는 것입니다. 이것은 문제가 발생한다고 말하는 것이 아닙니다. 문제가 발생하면 Microsoft는 문제를 해결하는 데 도움이되지 않습니다 (작동하지 않을 것이라고 보장하지 않기 때문에).
내가 말한 방법 sqlservr.exe
은 -q {new_collation_name}
스위치 로 실행 중 입니다 . 그것보다 조금 더 있지만 기본 아이디어입니다. 이 방법은 단순히 시스템 메타 데이터를 업데이트하는데, 이는 다음과 같은 주요 이점과 결과가 있습니다.
은혜
ALTER DATABASE
작동 을 방해하는 대부분의 제한을 우회결점
VARCHAR
데이터 수 의 코드 페이지 신구 정렬과 다르다시 변경 과 255 (0x80으로 - - 0xFF로) (128)의 값을 가진 자 존재 하고 해당 문자가 새로운 코드 값이 동일한 동일 자로없는 페이지. 따라서 데이터 손실 가능성이 있으며이 조건이 존재하지 않도록 데이터를 먼저 조사해야합니다. 그러나 이것은 또한 코드 페이지가 변경 되더라도 0-127의 값을 가진 문자 만 있으면 위험하지 않은 많은 경우가 있음을 의미합니다 .sqlservr.exe -q
방법이 수행하고 수행하지 않는 작업에 대한 자세한 설명 (다양한 수준에서 데이터 정렬이 작동하는 방법 및주의해야 할 잠재적 인 문제에 대한 세부 정보 포함)은 다음 게시물을 참조하십시오.
모든 사용자 데이터베이스에서 인스턴스, 데이터베이스 및 모든 열의 데이터 정렬 변경 : 무엇이 잘못 될 수 있습니까?
(시스템 데이터베이스를 포함 : 전용 인스턴스를 변경하려면 master
, model
, msdb
,과 tempdb
) 및 하나 개 이상의 데이터베이스 (그러나 모든 데이터베이스), 간단하게이 작업에서 제외 할 것을 데이터베이스 (들)을 분리 한 다음 전원을 다시 연결 데이터 정렬 업데이트가 완료되면