我们的每个客户都有一个拥有自己数据的数据库。每个数据库应该有完全相同的结构。如何找到其数据类型已更改的列,其中表名和列名相同,但数据类型不相同?有没有可以做到这一点的SQL查询?在所有等效的数据库中查找具有不同类型的列
回答
如果这两个数据库可以恢复到同一台服务器,你可以比较这两套系统目录视图,以确定差异:
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)
等) - 适应需要
谢谢@marc_s!有没有办法只输入一次数据库名称? – 2012-08-01 10:51:40
@MichaelSandler:不,我不这么认为 - 你需要在这里涉及的所有目录视图的完全合格的'db.schema.objectname'表示法...... – 2012-08-01 10:55:19
嗯,我有40个数据库在服务器上,我想检查对于类型差异,我期望让自己更容易:-) – 2012-08-01 10:57:17
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]
我希望得到一个SQL查询... – 2012-08-01 10:40:24
采取的模式的快照,并使用REDGATE's SQL Compare实用。
或输出模式为文本并使用BeyondCompare
- 1. 查找数据库中指定类型的所有列
- 2. SQL Server 2005查找某个数据类型的数据库中的所有列
- 3. 查找和具有不同的数据类型
- 4. Scrapy查找具有不同(类似)类的所有链接
- 5. 在Enterprise Architect中“在所有图中查找”的等效函数
- 6. 具有不同数据类型的数组的阵列
- 7. 查找所有表中的类型为nvarchar(最大)的所有列在SQL Server数据库
- 8. 在所有数据库的所有对象中查找表名
- 9. 具有不同数据类型列的二维阵列
- 10. 在一个data.frame中查找具有相同数据的列
- 11. 查找Mysql数据库的varchar列中的所有整数
- 12. 在sql server中找不到SQL_Variant的等效数据类型postgresql
- 13. 具有相同类型实体但数据库不同的多个数据源
- 14. 具有不同数据类型的计算列
- 15. 具有不同数据类型的Python片/子集阵列
- 16. Rails和FullCalendar - 具有不同列名的查询数据库
- 17. 联合所有与具有不同列数的查询
- 18. 找到列在所有数据库
- 19. 具有不同数据的不同用户类型
- 20. 在数据库表中查找具有不同条件的两个条目
- 21. 与数据库中的SET等效的数据类型?
- 22. 选择所有具有一列的列具有不同的值
- 23. 查找MySQL数据库表列中的所有字符?
- 24. 查找列表中不同元素数量的有效方法
- 25. 在MATLAB找到独特的行同时列有不同的数据类型
- 26. SQL:遍历数据库中的所有列并更改类型
- 27. 在Django的所有产品中查找不同的类别
- 28. 在SQL Developer中,如何找到数据库中所有表的所有列的不同值?
- 29. 查找列具有不同值
- 30. 在2个不同的数据库中的2个表,具有不同的结构,并且具有相同类型的数据进行同步
做了数据库的所有从单一的黄金映像启动此基础上查询(例如已还原的备份文件) ,还是从脚本创建的? – 2012-08-01 10:44:24
@Damien_The_Unbeliever我很遗憾我不知道 – 2012-08-01 10:45:39