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
대조표
저의 경우, 문제를 해결하는 가장 쉬운 방법은 다음과 같습니다.
- '라틴 아메리카, 스크립트 테이블을 사용하여...' 표의 복사본을 만들었습니다.
- 새 테이블은 분명히 내 데이터베이스의 '현대 스페인어' 모음을 획득했습니다.
- '라틴 아메리카' 표의 데이터를 새 표로 복사하고 이전 표를 삭제하고 새 표의 이름을 변경했습니다.
이것이 다른 사용자들에게 도움이 되길 바랍니다.
이것은 저에게 효과가 있었습니다. (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
'programing' 카테고리의 다른 글
vue.jest unit - 계산된 값을 기반으로 Watcher를 테스트하는 방법? (setComputed는 더 이상 사용되지 않습니다.) (0) | 2023.07.08 |
---|---|
매개 변수 전달을 통한 추가Target:action:ControlEvents (0) | 2023.07.08 |
ASP.NET ID 재설정 암호 (0) | 2023.07.08 |
Firebase Analytics 사용자 지정 이벤트 매개 변수 (0) | 2023.07.08 |
가져오기 오류: 동적 모듈이 init 함수를 정의하지 않습니다(initfizzbuzz). (0) | 2023.07.08 |