programing

SQL Server 쿼리에서 데이터 정렬 충돌을 해결하는 방법은 무엇입니까?

oldcodes 2023. 7. 8. 11:09
반응형

SQL Server 쿼리에서 데이터 정렬 충돌을 해결하는 방법은 무엇입니까?

두 개의 서로 다른 서버에서 가져온 두 테이블의 내부 조인을 사용하는 보기 작업을 수행하고 있습니다.우리는 연결된 서버를 사용하고 있습니다.쿼리를 실행할 때 다음 메시지가 표시됩니다.

"SQL_Latin1_General_CP1_" 간의 데이터 정렬 충돌을 해결할 수 없습니다.CI_AS 및 "아랍어_"CI_AS"는 연산과 같습니다.

저는 콜렉션에 대해 잘 모릅니다.인터넷을 검색하여 사용할 솔루션을 찾습니다.COLLATE하지만 그 개념은COLLATE잘 모르겠어요데이터베이스에 대해 변경 사항이 있습니까?나는 데이터베이스에 대해 아무것도 변경하지 않고 해결책을 찾고 있습니다.

이러한 개념에 대한 좋은 학습 자료는 환영합니다.

쿼리에 사용되는 데이터 정렬을 특정 데이터 정렬로 지정하여 문제를 해결할 수 있습니다.SQL_Latin1_General_CP1_CI_AS또는DATABASE_DEFAULT예:

SELECT MyColumn
FROM FirstTable a
INNER JOIN SecondTable b
ON a.MyID COLLATE SQL_Latin1_General_CP1_CI_AS = 
b.YourID COLLATE SQL_Latin1_General_CP1_CI_AS

위 쿼리에서 a.제 아이디와 b.ID는 텍스트 기반 데이터 유형의 열입니다.사용.COLLATE쿼리가 데이터베이스의 기본 정렬을 무시하고 대신 제공된 정렬을 사용하도록 강제합니다.SQL_Latin1_General_CP1_CI_AS.

기본적으로 각 데이터베이스는 "데이터에 대한 정렬 규칙, 대/소문자 및 액센트 민감도 속성을 제공"하는 고유한 조합을 가지고 있습니다(http://technet.microsoft.com/en-us/library/ms143726.aspx) 참조). 예를 들어 텍스트 데이터 유형이 있는 열에 적용됩니다.VARCHAR,CHAR,NVARCHAR등. 두 데이터베이스의 데이터 정렬이 서로 다른 경우, 서로 다른 두 데이터 정렬 간의 충돌을 해결하지 않고는 텍스트 열을 동등한 연산자(=)와 비교할 수 없습니다.

승인된 답변에 추가하여 사용할 수 있습니다.DATABASE_DEFAULT부호화로서

이를 통해 데이터베이스에서 사용자를 선택할 수 있으며 코드를 더욱 쉽게 이동할 수 있습니다.

SELECT MyColumn
FROM 
    FirstTable a
        INNER JOIN SecondTable b
            ON a.MyID COLLATE DATABASE_DEFAULT = b.YourID COLLATE DATABASE_DEFAULT

쿼리를 다른 쿼리로 묶어서 유사한 문제를 해결했습니다.

초기 쿼리는 Max 또는 Sum 함수를 사용하는 하위 쿼리에서 가져온 열과 "distinct" 또는 대/소문자 치환 등과 함께 개별 출력 열을 찾는 작업을 수행했습니다.

...을(를) 사용하여 단일 출력 필드를 생성하려고 시도한 후 데이터 정렬 오류가 발생했습니다.

select
rtrim(field1)+','+rtrim(field2)+','+...

쿼리는 내가 작성한 대로 실행되지만, SQL을 저장하고 다시 로드하면 오류가 발생합니다.

결국엔 이런 걸로 고치고 말았어요

select z.field1+','+z.field2+','+... as OUTPUT_REC
from (select rtrim(field1), rtrim(field2), ... ) z

일부 필드는 하위 쿼리의 "max"이며, null 및 기타 필드가 날짜 필드인 경우 대소문자로 대체되며, 일부 필드는 조인(NULL일 수 있음)으로 남겨집니다. 즉, 혼합 필드 유형입니다.이것이 OS colation과 Database colation이 조금 다른 것이 문제의 원인이라고 생각합니다만, 최종 선택 전에 모두 트리밍된 문자열로 변환하면 SQL에서 모두 정렬됩니다.

저는 대부분의 테이블을 가지고 있었기 때문에 콜리전에 문제가 있었습니다.Modern_Spanish_CI_AS하지만 내가 다른 데이터베이스에서 상속받거나 복사한 몇 개는 가지고 있었습니다.SQL_Latin1_General_CP1_CI_AS대조표

저의 경우, 문제를 해결하는 가장 쉬운 방법은 다음과 같습니다.

  1. '라틴 아메리카, 스크립트 테이블을 사용하여...' 표의 복사본을 만들었습니다.
  2. 새 테이블은 분명히 내 데이터베이스의 '현대 스페인어' 모음을 획득했습니다.
  3. '라틴 아메리카' 표의 데이터를 새 표로 복사하고 이전 표를 삭제하고 새 표의 이름을 변경했습니다.

이것이 다른 사용자들에게 도움이 되길 바랍니다.

이것은 저에게 효과가 있었습니다. (COLATE 문을 CONCAT 문에 추가)

SELECT CONCAT(TRIM(A.REFERRED_TO),' - ',TRIM(B.[NAME] COLLATE SQL_Latin1_General_CP1_CS_AS)), COUNT(A.REFERRED_TO) FROM CRIREFS AS A JOIN REFSERVS AS B ON B.CODE = A.REFERRED_TO AND B.ORGUUID = A.ORGUUID

언급URL : https://stackoverflow.com/questions/20544392/how-to-fix-a-collation-conflict-in-a-sql-server-query

반응형