2012-12-04 2 views
1

사용자 정의 함수를 통해 일부 뷰를 리팩터링했으며 동일한 값을 유지하고자합니다. 내가 이것을 적용하면, 나는 결과로 행 번호를 얻으SQL Server 제외 및 ANSI NULLS

SET ANSI_NULLS OFF 
GO 

SELECT TOP 1000 [DealNumber] 
     ,...others 
FROM OLD_VIEW 
EXCEPT 
SELECT TOP 1000 [DealNumber] 
      ,...others 
    FROM NEW_VIEW 

:이 테스트하는 작은 스크립트를 작성했습니다

경우입니다. 그러나 어떤 행에서 DealNumber를 가져 오면 다음을 실행합니다.

SET ANSI_NULLS OFF 
GO 

SELECT [DealNumber] 
     ,...others 
FROM OLD_VIEW 
WHERE DealNumber = 'MyDealNumber' 
EXCEPT 
SELECT [DealNumber] 
      ,...others 
FROM NEW_VIEW 
WHERE DealNumber = 'MyDealNumber' 

예상대로 빈 레코드 집합을 반환합니다.

대체 방법으로 이전 테스트를 수행하는 Test_View_Correctness 함수를 작성했습니다. 그러나 이것을 다음과 같이 실행하면 :

SELECT TOP 1000 [DealNumber] from OLD_VIEW 
where DealNumber IN (SELECT a.DealNumber 
        FROM Test_View_Correctness(DealNumber) as a) 

예외 접근 방식을 어떻게 보장 할 수 있습니까?

답변

1

당신은 잠재적으로 행의 완전히 다른 부분 집합을 반환하는 SQL없이 열-order by결코 보장 행 순서와 쿼리의 두 부분의 독특한 설정이 필요합니다

SELECT ... FROM (SELECT TOP 1000 [DealNumber],...others 
        FROM OLD_VIEW 
        ORDER BY x,y,z) a 
EXCEPT 
SELECT ... FROM (SELECT TOP 1000 [DealNumber],...others 
        FROM NEW_VIEW 
        ORDER BY x,y,z) b 
+0

이 키워드 'ORDER'근처의 구문이 잘못을 얻을 수 있습니다. – Edmondo1984

+0

SQL BOL에서 : ORDER BY 절에있는 열 이름 또는 별칭은 왼쪽 쿼리에서 반환 된 열 이름을 참조해야합니다. –

+0

@ Edmondo1984 편집보기 –

0

이것은 Except가 작업중인 행을 제한하기 위해 Top 1000을 사용한다는 사실이 원인입니다. EXCEPT는 왼쪽 쿼리에서 올바른 쿼리에없는 고유 값을 반환합니다. NOT EXISTS 을 사용하는 것이 좋습니다. 자세한 설명에 따라

SELECT TOP 1000 [DealNumber] 
      ,... others 
FROM OLD_VIEW 
WHERE NOT EXISTS 
    (SELECT * FROM NEW_VIEW WHERE OLD_VIEW.[DealNumber] = [DealNumber]) 

--- 업데이트

;WITH NV 
AS 
(
    SELECT *, CHECKSUM(*) as CHK 
    FROM NEW_VIEW 
), 
OV 
AS 
(
    SELECT *, CHECKSUM(*) AS CHK 
) 
SELECT * 
FROM NV 
FULL OUTER JOIN OV 
    ON NV.DealNumber = OV.DealNumber 
WHERE NV.DealNumber IS NULL -- CATCH missing rows in new view 
    OR OV.DealNumber IS NULL -- CATCH extra rows in new view 
    OR NV.CHK <> OV.CHK  -- CATCH differing columns in either view 
+0

일치시키기 위해 약 20 열을 사용하면 어떻게됩니까? – Edmondo1984

+0

# Edmondo1984 - 죄송합니다. 질문을 잘못 해석했습니다. 보기에 text, ntext, image 또는 xml 열이 있습니까? 그렇지 않으면 완전 외부 조인과 체크섬 (*) 함수를 사용하여 쿼리를 다시 작성하여 동등성을 테스트 할 수 있어야합니다. –

+0

아니요 ... 가장 큰 열은 varchar (255)이며 나머지는 주로 숫자입니다. 자세한 내용을 제공해 주시겠습니까? 고맙습니다 – Edmondo1984