2012-08-01 3 views
1

각 고객의 데이터베이스에는 자체 데이터가 있습니다. 각 데이터베이스는 정확히 동일한 구조를 가져야합니다. 데이터 유형이 변경되었지만 테이블 이름과 열 이름이 같지만 데이터 유형이 다른 열은 어떻게 찾을 수 있습니까? 이 일을 할 수있는 SQL 쿼리가 있습니까?동등한 데이터베이스에서 서로 다른 유형의 열 찾기

+0

는 데이터베이스 모두가 하나의 골든 이미지에서 시작 했 필요에 따라이 기본 쿼리 (복원 예를 들어, 백업 파일)을 적용 , 또는 스크립트로 작성된 것인가? –

+0

@Damien_The_Unbeliever 잘 모르겠습니다. 후불입니다. –

답변

1

을 사용하는 스키마 내보내기 :

SELECT 
    TableName = t.name, 
    ColumnName = c.name, 
    TypeName = ty.name, 
    TableName2 = t2.name, 
    ColumnName2 = c2.name, 
    TypeName2 = ty2.name 
FROM DB1.sys.columns c 
INNER JOIN DB1.sys.tables t ON c.object_id = t.object_id 
INNER JOIN DB1.sys.types ty ON c.system_type_id = ty.system_type_id 
INNER JOIN DB2.sys.tables t2 ON t.name = t2.Name 
INNER JOIN DB2.sys.columns c2 ON c2.object_id = t2.object_id AND c.name = c2.name 
INNER JOIN DB2.sys.types ty2 ON c2.system_type_id = ty2.system_type_id 
WHERE 
    c.system_type_id <> c2.system_type_id 

을 물론 sys.columns 카탈로그 뷰에서 더 많은 열을 추가 할 수 있습니다. 예 : 문자열 기반 유형에 대한 precisionDECIMAL(18,2) 같은 유형의 scale, 또는 max_length (등 VARCHAR(50) 등) -

+0

Thanks @marc_s! 한 번만 데이터베이스 이름을 입력 할 수있는 방법이 있습니까? –

+0

@MichaelSandler : 아니오 나는 그렇게 생각하지 않는다. 여기에 관련된 모든 카탈로그 뷰에 대해 완전한 db.schema.objectname 표기법이 필요하다 ... –

+0

글쎄, 내가 점검하고 싶은 서버에 40 개의 데이터베이스가있다. 유형 차이점에 대해서는 다음과 같이 직접 작성하려고합니다 :-) –

1

Atlantis SchemaInspector은 이러한 목적에 적합한 도구입니다.

편집 : SQL 쿼리를 사용하려면 한 쿼리에서 두 데이터베이스를 모두 사용해야합니다. 데이터베이스가 하나의 SQL Server 인스턴스에 있어야합니다. 그렇지 않으면 SQL Server 인스턴스가 링크 된 서버로 사용 가능해야합니다.

검색어 :

SELECT 
    * 
/* source database >>> */ 
FROM [SourceDatabase].[sys].[schemas] AS S_A 
INNER JOIN [SourceDatabase].[sys].[objects] AS O_A 
    ON [O_A].[schema_id] = [S_A].[schema_id] 
INNER JOIN [SourceDatabase].[sys].[columns] AS C_A 
    ON [C_A].[object_id] = [O_A].[object_id] 
/* <<< source database */ 
/* target database >>> */ 
LEFT JOIN [TargetDatabase].[sys].[schemas] AS S_B 
    ON [S_B].[name] = [S_A].[name] 
LEFT JOIN [TargetDatabase].[sys].[objects] AS O_B 
    ON [O_B].[schema_id] = [S_B].[schema_id] 
     AND [O_B].[name] = [O_A].[name] 
LEFT JOIN [TargetDatabase].[sys].[columns] AS C_B 
    ON [C_B].[object_id] = [O_B].[object_id] 
     AND [C_B].[name] = [C_A].[name] 
/* <<< target database */ 
WHERE [C_B].[column_id] IS NULL 
    OR [C_B].[system_type_id] <> [C_A].[system_type_id] 
+0

SQL 쿼리를 원했습니다 ... –

2

하는 스키마의 스냅 샷을 가지고 REDGATE's SQL Compare 유틸리티를 사용합니다.

또는 텍스트와 두 데이터베이스가 같은 서버로 복원 할 수있는 경우의 차이를 결정하기 위해, 당신은 시스템 카탈로그 뷰의 두 세트를 비교할 수 있습니다 BeyondCompare

관련 문제