2012-07-03 4 views
0

기본 키가 새 테이블에있을 때 기본 키 제약 조건으로 인해 테이블 ​​복사 오류가 발생합니다. 프라이 머리 키를 설정하지 않음으로써 조사를 할 때 소스 테이블에서 중복 된 행을 찾을 수 있었지만 여전히 그 경로가 어떻게되어 있는지 확신 할 수 없었지만, 내가 궁금해하는 점은 나머지 부분입니다.WHERE 절이 중복 행을 표시하지 않습니다.

여기 간다 :

내가 전체 테이블을 선택하고 반환하는 SQL 쿼리를 다음이 값을 볼 수 있습니다
SELECT * 
FROM search_term_suggest 
order by search_term 

가 중복 내가 찾을 수있는 테이블을 스크롤해야했다 그것.

SQL Results

하지만 내 쿼리를 제한 할 때

SELECT * 
FROM search_term_suggest 
where search_term = 'b' 

당신은 첫 번째 값을 필터링 볼 수 있습니다. 데이터베이스에 트리거가 없거나 선택 쿼리를 제한하는 것으로 보이는 항목이 없습니다.

SQL Results with "where" clause added

나는 SQL 2008 R2를 실행하고 있습니다. 어떤 도움이라도 대단히 감사합니다. 테이블을 복사하는 데이터베이스는 SQL 2000 데이터베이스이며, 위와 동일한 쿼리를 사용하여 선택하면 예상 한 결과를 얻습니다.

편집 : search_term은 varchar (100)이며 search_term_suggest는 테이블이 아닙니다.

+0

'search_term_suggest'는 테이블 또는 뷰입니까? 'search_term'의 데이터 타입은 무엇입니까? (트리거는 SELECT 트리거와 같은 것이 없기 때문에 관련이 없습니다.) –

+0

실행하면 결과가 어떻게되는지를 알려주십시오 : 'SELECT * FROM search_term_suggest where search_term LIKE'b % ''? –

+0

@GerardoLima가 LIKE 절을 추가하면 두 레코드가 모두 반환됩니다. 아론의 대답에있는 주석을 참조하십시오. – Robert

답변

5

내 추측 : search_termCHAR/NCHAR이고 후행 공백 (또는 후행했다 공백이 다른 이유로 고려되고 있음). 시도해보십시오 :

WHERE RTRIM(search_term) = 'b'; 

트림 작업의 영향을받지 않는 탭/캐리지 리턴을 제거해야 할 수도 있습니다. 패딩 설정 및 공백 '은 때로 믿을 것을 당신은 아마 varchar 또는 nvarchar에 열을 변경하고 확인 한 후 다시 빌드해야 search_term에 인덱스가 그래서 만약 위의 쿼리 모두, 인덱스를 사용 배제하는 것을

WHERE LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(search_term, 
    CHAR(9), ''), CHAR(10), ''), CHAR(13), ''))) = 'b'; 

주 문제를 일으킨다.

다른 추측 : @Dems는 첫 번째 쿼리에서 두 열의 길이를 확인합니다. 또한에만 조사 목적을 위해, 다음에 where 절을 변경하려고 : 당신이 어떤 결과를 얻을 경우

WHERE search_term LIKE 'b%' 
    AND LEN(search_term) > 1; 

는, 당신은 말할 수있다 : 이것은 당신이 그 속에있는 것을 문제를 해결하는 데 도움이됩니다

DECLARE @val VARCHAR(100), @i INT; 

DECLARE c CURSOR LOCAL STATIC READ_ONLY FAST_FORWARD 
    FOR SELECT search_term FROM dbo.search_term_suggest 
    WHERE search_term LIKE 'b%' 
    AND LEN(search_term) > 1; 

OPEN c; 

FETCH NEXT FROM c INTO @val; 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @i = 1; 
    PRINT '-----' + @val + ' (' + RTRIM(LEN(@val)) + ')'; 
    WHILE @i <= LEN(@val) 
    BEGIN 
    PRINT SUBSTRING(@val, @i, 1) + ' = ' + ASCII(SUBSTRING(@val, @i, 1)); 
    SET @i = @i + 1; 
    END 

    FETCH NEXT FROM c INTO @val; 
END 
CLOSE c; 
DEALLOCATE c; 

열 (b)을 제외하고 - 확인하지 않은 공백 (예 : 탭 또는 캐리지 리턴) 또는 기타 인쇄되지 않는 문자 일 수 있습니다.

+0

그것은 varchar (100)입니다. 죄송합니다. 위의 언급을 잊어 버렸습니다. RTRIM을 추가하면 같은 결과가 나타납니다. – Robert

+0

@ 로버트 - 첫 번째 쿼리에'LEN (search_term) AS length '를 추가하면 결과는 무엇입니까? – MatBailie

+0

한 행의 길이는 5이고 돌아 오는 행의 길이는 1입니다. 그래서 왜 RTRIM이 두 번째를 표시하지 않는지 이유 만 설명합니다. 그래서 지금 내 질문은 그것이 기본 키 제약 조건을 일으키는 이유는 무엇입니까? – Robert

3

IT는 SEARCH_TERM 값이 아니다 'B'하지만 29,645 행에 해당 될 수 'B'(즉, 공백이어서 B)

0

b는 화면 상에 b와 같이 나타나는 문자 여야합니다. 특히 해당 열에 제약 조건이있는 경우 특히 그렇습니다. 쿼리 결과를 텍스트로 복사하면 텍스트 편집기에서 "b"를 검색하여 찾을 수 있습니까?

관련 문제