2009-07-14 6 views
4

SQL Server 2005 인스턴스에서이 오류를 이해하고 싶습니다.데이터 정렬 문제 - SQL Server 2005

동작과 동일하게 에 "SQL_Latin1_General_CP1_CI_AI" "Latin1_General_CI_AI"사이에 데이터 정렬 충돌 를 해결 할 수 없습니다 아래에 오류가 발생했습니다. 간단한 쿼리에 포함

두 데이터베이스는 라틴어 일반 CI AI을 가지고 있지만 전 SQL 라틴어 일반 CP1 CI AI했다. 나는 데이터베이스와 일치 시키려고하는 데이터 정렬을 변경했지만 사용자 데이터베이스의 테이블과 임시 테이블을 조인하려고 할 때마다 앞서 언급 한 오류가 발생합니다. 임시 테이블을 만드는 데 문제가 없습니다.

+0

정확하게 내가 이해하려고하는 이유는 내 임시 데이터베이스와 사용자 데이터베이스가 동일한 데이터 정렬 옵션을 갖고있는 경우 오류가 발생하는 이유입니다. – Joel

+0

데이터 정렬 문제를 일으키는 조인 후에 COLLATE DATABASE_DEFAULT를 추가하여 내 문제를 반쯤 해결했습니다. 나는 그런 식으로 쿼리를 만들 수 있었지만 문제의 원인을 완전히 이해하지 못하기 때문에 여전히이 데이터 정렬 문제에 당혹 스럽다. – Joel

+0

흥미로 우며 database_default가 문제를 해결했지만 다른 대답을 수락했다고 말하는 것은 흥미 롭다.) –

답변

6

당신은 당신이 그들에게 동일하게 실시간으로 데이터 정렬을 변경하는 COLLATE를 사용할 수 있습니다 가입하면 : 그 CUST 가정

select c.name, o.orderid from customer as c 
inner join order as o on c.custid = o.custid COLLATE SQL_Latin1_General_CP1_CI_AI 

이 SQL_Latin1_General_CP1_CI_AI과 순서가 다른 데이터 정렬이며, 위의 쿼리는 문제가 해결됩니다 .

+0

데이터베이스 데이터 정렬을 변경 했어도 개체 데이터 정렬은 여전히 ​​이전 데이터 정렬입니다. 테이블을 마우스 오른쪽 버튼으로 클릭하고 속성으로 이동하십시오. 오래된 데이터 정렬에 있음을 알 수 있습니다. –

+0

나는 당신이 언급 한대로했다. 속성 페이지가 표시되는 한 데이터베이스 개체는 올바른 데이터 정렬 설정을 상속하므로 나 혼란 스럽습니다. 그것은 임시 테이블에서만 일어나는 것 같습니다. – Joel

+0

기본적으로 데이터베이스 데이터 정렬을 변경해도 개체 내의 데이터 정렬은 변경되지 않습니다. DB 콜레 션이 변경된 후에 생성되지 않으면 새 콜 레션을 얻는 것이 이상합니다. 어쨌든 임시 테이블이있는 TempDB의 콜레 션이어야합니다. –

3

테이블 디자인에서 조인 할 두 필드의 데이터 정렬 설정이 같아야합니다. 당신은 임시 테이블을 생성하고 데이터베이스가 임시 데이터베이스 이외의 다른 데이터 정렬 경우

ALTER TABLE <table> 
ALTER COLUMN <column> VARCHAR(200) COLLATE Latin1_General_CI_AI 
GO 
+0

tricat 제안과 같은 열 데이터 정렬을 변경하는 것이 좋습니다. 응용 프로그램을 배포 할 때 SQL Server 구성의 차이로 인해 쿼리의 데이터 정렬 명령이 충분하지 않을 수 있으므로 –

2

(시스템과 동일한 정렬을 사용 - 설치 기준), 다음 비교/조회/조인 - 문제가있을 수 있습니다. 간단한 트릭은 약 이 DATABASE_DEFAULT 사용하는 것입니다 얻을 :

CREATE TABLE #test2 
(
    col1 varchar(12) COLLATE database_default 
) 
go 

다시합니다. Changing Database Collation and dealing with TempDB Objects

데이터베이스의 데이터 정렬 순서를 변경 한 후에 모든 인덱스를 다시 작성 했습니까?

+0

내 tempDB가 모두 데이터베이스와 동일한 데이터 정렬을 갖는 경우 어떻게해야합니까? 같이 가려고? – Joel

+0

데이터베이스 데이터 정렬을 변경했을 수도 있지만 데이터베이스의 개체 정렬은 변경되지 않습니다. 테이블을 마우스 오른쪽 버튼으로 클릭하고 속성으로 이동하십시오. 오래된 데이터 정렬이 있음을 알 수 있습니다. –

+0

모든 색인을 다시 작성하지 않았습니다. – Joel

1

데이터 정렬이 서로 다른 서버간에 데이터베이스를 이동할 때 매우 유사한 문제가 발생했습니다. 데이터베이스는 원래의 데이터 정렬과 함께 제공되지만 새 서버의 데이터 정렬 (따라서 tempdb 데이터베이스의 데이터 정렬)이 다르므로 임시 테이블을 만들고이 테이블에 조인하려고하면 문제가 발생합니다.

데이터베이스의 데이터 정렬이 서버의 데이터 정렬과 동일하다고 말하면 다른 데이터 정렬을 사용하는 일부 열이 있어야합니다. (열 단위로 정렬을 변경할 수 있습니다).

어쨌든 대상 서버를 복원 한 후에 전체 데이터베이스의 데이터 정렬을 변경하여 이러한 문제를 해결할 수 있습니다. 그건 수동으로 할 PITA지만 운 좋게도 tool이 있습니다.

0

메모리 내 tempDb를 사용하는 경우 필요에 따라 다시 작성됩니다. 따라서 모델 데이터베이스의 데이터 정렬이 다르면 tempDb와 같이 새로 만든 db가 모델에서 상속됩니다.

+0

tempDB는 메모리에 있는지 여부에 관계없이 Model의 데이터 정렬을 항상 상속합니다 (극히 소수). –