我们的每个客户都有一个拥有自己数据的数据库。每个数据库应具有完全相同的结构。如何找到其数据类型已更改的列,其中表名和列名相同但数据类型不是?是否有可以执行此操作的SQL查询?
答案 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
等),scale
或DECIMAL(18,2)
等类型max_length
和VARCHAR(50)
- 根据需要调整此基本查询