태그 보관물: sql-server-2008-r2

sql-server-2008-r2

2 개의 SQL 테이블 간의 컨텐츠 차이점을 찾고 동기화 SQL을 생성하는 방법 두 테이블 간의 데이터

정확한 스키마가있는 두 테이블 간의 데이터 차이를 어떻게 찾습니까? 동기화 결과를 얻기 위해 동기화 SQL을 생성하는 방법은 무엇입니까?

이들은 2 개의 테이블입니다 :

SOURCE01.dbo.Customers (31,022 rows)

TARGET01.dbo.Customers (29,300 rows)

각 테이블의 스키마는 다음과 같습니다.

  • [CustomerId] : nvarchar(255)
  • [CustomerSerializedProfile]: nvarchar(max)
  • [CreatedDatetime] : DateTime


답변

이전 답변에서 언급 한 tablediff 및 powershell 외에 SQL을 UNION ALL 문과 함께 사용하여 두 개의 동일한 테이블에서 일치하지 않는 레코드를 찾을 수도 있습니다.

SELECT MIN(TableName) AS TableName
   ,ID
   ,NAME
   ,lastname
   ,Address
   ,City
FROM (
SELECT 'Table A' AS TableName
    ,Customers.id
    ,Customers.NAME
    ,Customers.lastname
    ,Customers.Address
    ,Customers.City
FROM Customers

UNION ALL

SELECT 'Table B' AS TableName
    ,CustomersOld.id
    ,CustomersOld.NAME
    ,CustomersOld.lastname
    ,CustomersOld.Address
    ,CustomersOld.City
FROM CustomersOld
) tmp
GROUP BY ID
   ,NAME
   ,lastname
   ,Address
   ,City
HAVING COUNT(*) = 1
ORDER BY id;

시도 할 수있는 또 다른 옵션은 Visual Studio 자체에서 데이터 비교를 사용하는 것입니다. 소스 데이터베이스와 대상 데이터베이스의 데이터를 비교하고 동기화하기 위해 선택한 테이블에 대한 동기화 스크립트를 작성합니다.

마지막으로 SQL 데이터 비교 도구 인 ApexSQL Data Diff 를 사용하여 모든 동기화 옵션을 설정하고 테이블과 열을 다른 이름으로 매핑하고 GUI에서 비교할 고유 한 키를 만들 수 있습니다. 무인으로 실행되도록 예약 할 수 있으며 아침에 SQL Server 작업 기록을 확인하기 만하면됩니다. 이러한 옵션에 대한 자세한 내용은 다음 기사를 참조하십시오. http://solutioncenter.apexsql.com/automatically-compare-and-synchronize-sql-server-data/


답변

놀랍게도 아직 이것이 SQL Server Data Tools에 내장되어 있다고 언급 한 사람은 없습니다. 예를 들어 기능은 Redgate와 비교할 때 기본적이지만.

하나 이상의 테이블에서 데이터를 참조 데이터베이스의 데이터와 비교 및 ​​동기화에 대한 일부 세부 사항


답변

기본 도구 사용 :

tablediff : tablediff 유틸리티 는 소스 테이블의 데이터를 대상 테이블의 테이블과 비교합니다.

powershell : 비교 객체를 사용하면 얻을 수 있습니다. 여기 좋은 예가 있습니다

타사 :

redgate 스키마와 데이터 비교. Powershell 및 스키마 / 데이터 비교를 사용하여 작업을 자동화 할 수도 있습니다.


답변

나는 최근에 비슷한 목적으로 이것을 사용했다.

select
    s.*
    ,t.*
from SOURCE01.dbo.Customers as s
full outer join TARGET01.dbo.Customers as t
    on s.CustomerId = t.CustomerId
where s.CustomerSerializedProfile <> t.CustomerSerializedProfile
or s.CreatedDatetime <> t.CreatedDatetime
or s.CustomerId is NULL
or t.CustomerId is NULL;

일관된 기본 키에 의존합니다. 그러나 결국에는 일관성이 있어야합니다. 위와 같은 코드를 생성하는 메타 스크립트는 비교적 작성하기 쉽고 많은 열 테이블을 쉽게 비교할 수 있습니다.

동기화를위한로서 당신은해야합니다 source left join targettarget left join source다음 각의 결과로 수행 할 작업을 결정합니다.


답변

이렇게하면 두 테이블 간의 차이점이 생겨서이를 삽입 쿼리에 래핑하여 A의 차이점을 B로 또는 그 반대로 할 수 있습니다.

SELECT A.CustomerId, A.CustomerSerializedProfile, A.CreatedDatetime
  FROM SOURCE01.dbo.Customers A
 WHERE NOT EXISTS (SELECT B.ID
                 FROM TARGET01.dbo.Customers
                WHERE B.CustomerId= A.CustomerId
                  AND B.CustomerSerializedProfile= A.CustomerSerializedProfile
                  AND B.CreatedDatetime= A.CreatedDatetime)


답변

무료 도구 중 하나에 TableDiff에 대한 전체 인터페이스가 있습니다.

http://nobhillsoft.com/Diana.aspx

또한 DB 비교 도구를 확인하십시오. 무제한의 데이터를 비교할 수있는 유일한 방법입니다 (다른 데이터는 수백만 및 수백만 개의 레코드를 수행 할 수 없음).…

http://nobhillsoft.com/NHDBCompare.aspx

(우리는 타사 제품에 대한이 스레드의 다른 링크를 보았으므로 합법적으로 우리 제품을 언급한다고 생각합니다 … pls가 아닌 경우 알려주십시오)


답변

두 테이블에 모두 비슷한 기본 키가있는 경우 아래 전략을 사용하여 소스 테이블과 대상 테이블을 비교할 수 있습니다. (별표로 복합 키 열을 표시했습니다)

with src as (select someCol1*,
                    someCol2*,
                    someCol3,
                    someCol4,
                    someCol5
             from src_table),

tgt as (select someCol1NameCouldDiffer* as someCol1,
               someCol2*,
               someCol3,
               someCol4,
               someCol5
        from tgt_table),

--Find which keys have at least 1 non-key column difference:

diffs as (select someCol1,
                 someCol2
          from (select all 5 columns
                from src
                **union**
                select all 5 columns
                from target )
           **group by** someCol1, someCol2
           **having count(*)>1**

--Reselect all columns you wish to compare from src union target, 
--joining on the keys from "diffs" above to show only records which 
--have data differences.

select *
from (select all 5 columns
      from src
      union
      select all 5 cols
       from tgt) t1
join diffs on t1.someCol1 = diffs.someCol1
           and t1.someCol2 = diffs.someCol2
**order by ** someCol1, someCol2 desc

Union은 암시 적으로 고유 한 레코드를 반환하기 때문에 작동합니다. 따라서 소스의 주어진 행 (일부 키로 식별)에 대해 대상에서 정확히 일치 할 것으로 예상되면 src와 대상의 합집합이 주어진 키에 대해 1 행을 반환 할 것으로 기대합니다. 따라서 위의 전략을 사용하여 여러 행이있는 통합 결과를 반환하는 를 찾은 다음 src 통합 대상을 다시 쿼리합니다 (이번에는 diff 테이블과 조인하여 차이점이있는 레코드 만 선택). 키를 구성하는 열을 기준으로 순서를 비교하면 일치하지 않는 열을 정확하게 볼 수 있습니다. 소스와 대상의 열 이름은 “as”문을 사용하여 서로 별칭을 지정할 수 있으므로 일치하지 않아도됩니다.