在所谓的等效数据库中查找具有不同类型的列

时间:2012-08-01 10:36:21

标签: sql-server

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

3 个答案:

答案 0 :(得分:2)

拍摄模式的快照并使用REDGATE's SQL Compare实用程序。

或者将架构导出到文本并使用BeyondCompare

答案 1 :(得分: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]

答案 2 :(得分: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目录视图中添加更多列,例如对于基于字符串的类型(如precision等),scaleDECIMAL(18,2)等类型max_lengthVARCHAR(50) - 根据需要调整此基本查询