1

各クライアントには、独自のデータを含むデータベースがあります。各データベースは、まったく同じ構造を持つ必要があります。テーブル名と列名が同じでデータ型が異なる、データ型が変更された列を見つけるにはどうすればよいですか? これを実行できる SQL クエリはありますか?

4

3 に答える 3

2

スキーマのスナップショットを取り、REDGATE の SQL 比較ユーティリティを使用します。

または、スキーマをテキストにエクスポートし、BeyondCompareを使用します

于 2012-08-01T10:40:42.137 に答える
1

Atlantis SchemaInspectorは、この目的に適したツールです。

編集: SQL クエリが必要な場合は、1 つのクエリで両方のデータベースを使用できる必要があります。したがって、データベースは 1 つの SQL サーバー インスタンス上にある必要があります。または、SQL サーバー インスタンスがリンク サーバーとして利用可能である必要があります。

クエリ:

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]
于 2012-08-01T10:38:00.180 に答える
1

両方のデータベースを同じサーバーに復元できる場合は、2 つのシステム カタログ ビューのセットを比較して違いを判断できます。

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カタログ ビューから列を追加することもできます。たとえばprecisionscaleのような型DECIMAL(18,2)max_length文字列ベースの型 (VARCHAR(50)など) の場合は、必要に応じてこのベース クエリを調整します。

于 2012-08-01T10:45:41.027 に答える