2012-10-17 2 views
1

정확히 동일한 스키마로 실제와 예상을 위해 정의 된 두 개의 테이블이 있습니다. 2의 ID 말에 나는tSQLt AssertEqualsTable이 순서를 확인하지 않음

1. 나는

INSERT INTO actual EXEC tSQLt.ResultSetFilter 1, '{statement}' 

실제 다음
EXEC tSQLt.AssertEqualsTable @expected = 'expected' , @actual = 'actual' 

결과를 비교하기 위해 채울 실행, 예상되는 테이블에 두 개의 행을 삽입합니다.

데이터의 순서가 다르지만 (실제 ID는 1, 2) 테스트에 합격합니다.

실제 데이터를 SELECT * FROM에 추가하고 테스트에서 SELECT * FROM을 추가하고 tSQLt.Run '{test name}'을 사용하여 테스트를 실행하여 데이터가 다르다는 것을 확인했습니다.

알려진 버그인지 누구든지 알고 있습니까? 분명히 그것은 행마다 검사하여 순서를 확인해야합니다. 다른 모든 열은 반환되는 NULL이며 값을 포함하는 ID 열입니다.

답변

3

select 절에 order by 절을 지정하지 않으면 SQL 서버에서 순서가 보장되지 않습니다 (맨 위 글 머리표 this MSDN page 참조). 실제로는 예상대로 자주 주문됩니다.

왜냐하면 동일하지 않고 동일한 행을 찾는 tSQLt가 적합하다고 생각합니다.하지만 순서를 확인하지 않아도됩니다. 그렇지 않으면 대답이 SQL 서버의 변칙에서 바뀔 수 있으며 테스트는 의미가 없습니다 (그리고 더 나쁜 - 간헐적으로 실패합니다!). tSQLt user guide on AssertEqualsTable은 테이블의 내용을 확인하지만 그 안의 순서를 검사하는 것은 아닙니다. 주문을 확인해야한다고 결론 내릴 수있는 이유는 무엇입니까? 나는 그것에 대한 언급을 찾을 수 없었다.

주문을 확인해야하는 경우 ID 열이있는 임시 테이블에 예상 결과와 실제 결과를 모두 삽입하거나 ROW_NUMBER를 사용하여 결과 테이블을 확인할 수 있습니다. 주문이 다르면 IDC가 다를 수 있습니다.

here on Greg M Lucas' blog과 유사한 방법이 있습니다.

order by 절을 사용하지 않고 테이블에서 반환 된 순서에 의존하는 것은 권장되지 않습니다. (MSDN link) - 응용 프로그램의 명령문 호출에 하나를 포함 시키거나 반환되는 순서가 SP 인 경우 행이 중요합니다.

+0

Greg의 게시물에서 "결과가 반환되는 순서를 테스트하는 중"이 내용이 지워지고 설명이 확인됩니다. 나는 AssetEqualsTable이 그렇게 할 것이라고 생각했다. 색인을 추가하면이 문제가 해결됩니다. 감사. –

+1

명시 적으로 삽입 순서를 모델링하기 위해 테이블에서 열이없는'ROW_NUMBER()'를 어떻게 사용할 수 있는지 잘 모르겠습니다. @ 배리 킹 : 나는 인덱스가 도움이 될지 모르겠다. 결론 : SQL 테이블에 정의가 없기 때문에 * 테이블은 동일합니다. – onedaywhen

관련 문제