정확한 스키마가있는 두 테이블 간의 데이터 차이를 어떻게 찾습니까? 동기화 결과를 얻기 위해 동기화 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 target
및 target 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”문을 사용하여 서로 별칭을 지정할 수 있으므로 일치하지 않아도됩니다.