2012-08-01 42 views
1

我们的每个客户都有一个拥有自己数据的数据库。每个数据库应该有完全相同的结构。如何找到其数据类型已更改的列,其中表名和列名相同,但数据类型不相同?有没有可以做到这一点的SQL查询?在所有等效的数据库中查找具有不同类型的列

+0

做了数据库的所有从单一的黄金映像启动此基础上查询(例如已还原的备份文件) ,还是从脚本创建的? – 2012-08-01 10:44:24

+0

@Damien_The_Unbeliever我很遗憾我不知道 – 2012-08-01 10:45:39

回答

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)等) - 适应需要

+0

谢谢@marc_s!有没有办法只输入一次数据库名称? – 2012-08-01 10:51:40

+0

@MichaelSandler:不,我不这么认为 - 你需要在这里涉及的所有目录视图的完全合格的'db.schema.objectname'表示法...... – 2012-08-01 10:55:19

+0

嗯,我有40个数据库在服务器上,我想检查对于类型差异,我期望让自己更容易:-) – 2012-08-01 10:57:17

1

Atlantis SchemaInspector是达到此目的的好工具。

编辑: 如果你想要SQL查询,你需要在一个查询中可用的两个数据库。 所以数据库必须在一个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] 
+0

我希望得到一个SQL查询... – 2012-08-01 10:40:24

相关问题