各クライアントには、独自のデータを含むデータベースがあります。各データベースは、まったく同じ構造を持つ必要があります。テーブル名と列名が同じでデータ型が異なる、データ型が変更された列を見つけるにはどうすればよいですか? これを実行できる SQL クエリはありますか?
質問する
121 次
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
カタログ ビューから列を追加することもできます。たとえばprecision
、scale
のような型DECIMAL(18,2)
やmax_length
文字列ベースの型 (VARCHAR(50)
など) の場合は、必要に応じてこのベース クエリを調整します。
于 2012-08-01T10:45:41.027 に答える