1

我们的每个客户都有一个包含自己数据的数据库。每个数据库都应该具有完全相同的结构。如何找到数据类型已更改的列,其中表名和列名相同但数据类型不同?是否有可以执行此操作的 SQL 查询?

4

3 回答 3

2

拍摄模式的快照并使用REDGATE 的 SQL 比较实用程序。

或将模式导出为文本并使用BeyondCompare

于 2012-08-01T10:40:42.137 回答
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]
于 2012-08-01T10:38:00.180 回答
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目录视图中添加更多列,例如precisionscale对于类似的类型DECIMAL(18,2),或max_length对于基于字符串的类型(如VARCHAR(50)等) - 根据需要调整此基本查询

于 2012-08-01T10:45:41.027 回答