Database/MS SQL

equal to 작업에서의 데이터 정렬 충돌을 해결할 수 없습니다.

catchv 2011. 9. 24. 13:07

MS SQL에서 테이블의 컬럼 중 char, varchar, text, nchar, nvarchar 및 ntext은 collation을 설정 할 수 있다.
MSDN의 설명을 보면

열에 대한 데이터 정렬을 지정합니다. 데이터 정렬 이름은 Windows 데이터 정렬 이름이나 SQL 데이터 정렬 이름이 될 수 있습니다.

이렇게 정의 되어 있습니다. 말 그대로 데이터를 정렬할 때 기준을 설정해 주는 것입니다.
그런데 문제는 이것이 설정상 변경 될 수 있는 것입니다.

CREATE TABLE tt_1
(
        id
        INT
    ,    name    VARCHAR(10)    COLLATE Korean_Wansung_CI_AS
)
GO

CREATE
TABLE tt_2
(
        id
        INT
    ,
    name
    VARCHAR(10)    COLLATE Korean_Wansung_BIN
)

SELECT    *
FROM    
    sys.columns
WHERE    
    OBJECT_ID('tt_1') = object_id


위와 같이 임의로 선택 할 수 있습니다.
이로써 발생 할 수 있는 문제는
SELECT    *
FROM        tt_1 A
        INNER JOIN tt_2 B
        ON A.name = B.name

메시지468, 수준16, 상태9, 줄4
equal to 작업에서의"Korean_Wansung_BIN"과(와) "Korean_Wansung_CI_AS" 간의데이터정렬충돌을해결할수없습니다.
같은
에러가
납니다.
해결 방법은 두가지 입니다.

아시겠지만 컬럼의 collate 변경입니다.
ALTER TABLE tt_2
    ALTER COLUMN name VARCHAR(10) COLLATE Korean_Wansung_CI_AS

두번째는
퀴리에서 collation을 변경하는 것입니다.

SELECT    *
FROM        tt_1 A
        INNER JOIN tt_2 B
        ON A.name = B.name COLLATE Korean_Wansung_CI_AS

하지만
두번째 방법을 사용하면


Compute Scalar로 변경을 하고 Join을 하네요.
분산 환경이 아닌 경우 첫 번째 경우가 좋은 선택일 것 같습니다.