2012-09-28 2 views
4

다음 오류 메시지가 나타납니다.데이터 정렬 충돌을 해결할 수 없습니다.

동등 작업에서 "Latin1_General_CI_AI"와 "SQL_Latin1_General_CP1_CI_AS"간의 데이터 정렬 충돌을 해결할 수 없습니다.

아래 코드를 WHERE 절에 넣으면 나옵니다.

WHERE Region IN (SELECT Token FROM dbo.getParmsFromString(@Region)) 

이제 @Region에는 내 다중 선택 필드 인 SSRS의 모든 값이 포함되어 있습니다.

다음은 사용되는 기능 코드입니다.

CREATE FUNCTION [dbo].[getParmsFromString] 
    (@String VARCHAR(MAX)) 
RETURNS @Parms TABLE 
(
    Token VARCHAR(MAX) 
) 
AS 
BEGIN 
    IF CHARINDEX(',', @String) != 0 
    BEGIN 
     ;WITH cte0(Token, List) AS 
       (
       SELECT SUBSTRING(@String, 1, CHARINDEX(',',@String,1) - 1) 
         ,SUBSTRING(@String,CHARINDEX(',',@String,1) + 1, LEN(@String)) + ',' 

       UNION ALL 

       SELECT  SUBSTRING(List,1,ISNULL(CHARINDEX(',',List,1) - 1,1)) 
         ,SUBSTRING(List,CHARINDEX(',',List,1) + 1, LEN(List)) 
       FROM cte0 
       WHERE LEN(cte0.List) > 0 
      ) 

      INSERT INTO @Parms (Token) 
      SELECT Token 
      FROM cte0 
      OPTION (MAXRECURSION 0) 
     RETURN; 
    END 

    ELSE 
     INSERT INTO @Parms 
      SELECT @String 
     RETURN; 
END 

답변

2

시도로

try changing RETURNS @Parms TABLE 
( 
    Token VARCHAR(MAX) COLLATE DATABASE_DEFAULT 
) 

WHERE Region IN (SELECT Token FROM dbo.getParmsFromString(@Region)) 

RETURNS @Parms TABLE 
( 
    Token VARCHAR(MAX) 
) 

변경

WHERE Region COLLATE DATABASE_DEFAULT IN (SELECT Token FROM dbo.getParmsFromString(@Region)) 
0

일반적으로이 유형의 오류는 다른 지역의 데이터를 비교하려고 할 때 또는 다른 암호화를 사용하여 특정 데이터를 다른 데이터와 비교할 때 발생합니다. 가장 일반적인 이유는 데이터베이스가 "Latin1_General_CI_AS"을 사용하는 동안 해당 tempdb가 "SQL_Latin1_General_CP1_CI_AS"의 데이터 정렬을 사용하고 있기 때문입니다. 결과적으로 temp 개체는 "SQL_Latin1_General_CP1_CI_AS" 데이터 정렬로 생성 된 다음 데이터 정렬 "Latin1_General_CI_AS"을 사용하는 데이터베이스의 데이터베이스 개체와 비교하지 못합니다.

가장 쉬운 해결 방법과 가장 적합한 방법은 데이터 정렬 "Latin1_General_CI_AS"을 사용하여 설치된 서버에서 데이터베이스를 실행하는 것입니다.

참고하시기 바랍니다. SQL 데이터 정렬 ("SQL_Latin1_General_CP1_CI_AS")은 이전 버전과의 호환성을 위해 sql 서버에 있습니다. 유니 코드 및 비 유니 코드 데이터를 사용하여 국제 데이터 또는 데이터베이스를 처리 할 때는 Windows 데이터 정렬 ("Latin1_General_CI_AS")을 사용하는 것이 좋습니다.

다음과 같은 방법으로 데이터베이스의 데이터 정렬을 변경할 수 있습니다

use master 
ALTER DATABASE "Your database" 
COLLATE Latin1_General_CI_AS; 

SELECT name, collation_name 
FROM sys.databases; 

하고 필요한 경우 당신은 또한 "마스터"데이터베이스 즉의 데이터 정렬을 변경할 수 있습니다

http://msdn.microsoft.com/en-us/library/dd207003(v=sql.100).aspx

http://sqlbuzz.wordpress.com/2011/08/20/how-to-rebuild-master-database-aka-rebuilding-sql-server-2008r2/

을하지만이 일을하기 전에 백업 할 모든 데이터베이스를 만들이이 링크를 통해 이동에 대한 데이터베이스를 다시 작성.

관련 문제