我们的每个客户都有一个包含自己数据的数据库。每个数据库都应该具有完全相同的结构。如何找到数据类型已更改的列,其中表名和列名相同但数据类型不同?是否有可以执行此操作的 SQL 查询?
问问题
121 次
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
目录视图中添加更多列,例如precision
,scale
对于类似的类型DECIMAL(18,2)
,或max_length
对于基于字符串的类型(如VARCHAR(50)
等) - 根据需要调整此基本查询
于 2012-08-01T10:45:41.027 回答