MSSQL 模式比较 T SQL
MSSQL Schema Compare by T SQL
我在同一台服务器上有 21 个 DB,它们 'supposed' 具有相同的架构(截至目前仅限于 table 架构)但它们没有。
在我所在的环境中,我无法按照合规性规则安装任何 tool/applications。
我能想到的唯一方法是提取 excel 中所有 21 个数据库的模式并进行比较,但这很乏味。
有人可以指导我开发一个 T-SQL,它可以比较所有 21 个数据库的架构并突出显示差异吗?
这些是我需要的栏目:
Table_Name,列名,数据类型,最大长度,is_nullable,is_replicated,主键
下面的 T-sql 为我提供了这个信息。
我需要一些关于如何比较 21 个数据库的信息的想法
SELECT a.name Table_Name, c.name 'Column Name',
t.Name 'Data type',
c.max_length 'Max Length',
c.is_nullable,a.is_replicated ,
ISNULL(i.is_primary_key, 0) 'Primary Key'
FROM Sys.tables a inner join sys.columns c
On A.object_id=C.object_id
INNER JOIN
sys.types t ON c.user_type_id = t.user_type_id
LEFT OUTER JOIN
sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
LEFT OUTER JOIN
sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
Order by 1,2
我需要一个起点
我必须在类似的限制下一直做这样的事情,包括没有为其设计的专业工具的好处。这是一种方法:
首先创建一个临时 table 来保存 table 信息:
CREATE TABLE #DbSchemas(
DbName nvarchar(128) NULL,
Table_Name sysname NOT NULL,
[Column Name] sysname NULL,
[Data type] sysname NOT NULL,
[Max Length] smallint NOT NULL,
is_nullable bit NULL,
is_replicated bit NULL,
[Primary Key] bit NOT NULL
)
GO
然后将您已有的查询包装在未记录的系统过程中 sp_MSforeachdb
以在每个数据库上执行它,将结果添加到 #DbSchemas table:
EXECUTE master.sys.sp_MSforeachdb 'USE [?];
INSERT INTO #DbSchemas
SELECT DB_NAME() DbName, a.name Table_Name, c.name [Column Name],
t.Name [Data type],
c.max_length [Max Length],
c.is_nullable,a.is_replicated ,
ISNULL(i.is_primary_key, 0) [Primary Key]
FROM Sys.tables a inner join sys.columns c
On A.object_id=C.object_id
INNER JOIN
sys.types t ON c.user_type_id = t.user_type_id
LEFT OUTER JOIN
sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
LEFT OUTER JOIN
sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
Order by 1,2
;
';
go
现在您应该能够从#DbSchemas 中的任何数据库查询数据table:
select * from #DbSchemas where Dbname = 'master'
最后,要比较它们你可以使用这样的东西:
SELECT * FROM #DbSchemas s1
WHERE DbName = 'msdb'
AND NOT EXISTS(
SELECT * FROM #DbSchemas s2
WHERE s2.DbName = 'master'
AND s2.Table_Name = s1.Table_Name
AND s2.[Column Name] = s1.[Column Name]
AND s2.[Data type] = s1.[Data type]
AND s2.[Max length] = s1.[Max length]
AND s2.is_nullable = s1.is_nullable
AND s2.is_replicated = s1.is_replicated
AND s2.[Primary Key] = s1.[Primary Key]
)
我在同一台服务器上有 21 个 DB,它们 'supposed' 具有相同的架构(截至目前仅限于 table 架构)但它们没有。 在我所在的环境中,我无法按照合规性规则安装任何 tool/applications。 我能想到的唯一方法是提取 excel 中所有 21 个数据库的模式并进行比较,但这很乏味。
有人可以指导我开发一个 T-SQL,它可以比较所有 21 个数据库的架构并突出显示差异吗?
这些是我需要的栏目: Table_Name,列名,数据类型,最大长度,is_nullable,is_replicated,主键
下面的 T-sql 为我提供了这个信息。 我需要一些关于如何比较 21 个数据库的信息的想法
SELECT a.name Table_Name, c.name 'Column Name',
t.Name 'Data type',
c.max_length 'Max Length',
c.is_nullable,a.is_replicated ,
ISNULL(i.is_primary_key, 0) 'Primary Key'
FROM Sys.tables a inner join sys.columns c
On A.object_id=C.object_id
INNER JOIN
sys.types t ON c.user_type_id = t.user_type_id
LEFT OUTER JOIN
sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
LEFT OUTER JOIN
sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
Order by 1,2
我需要一个起点
我必须在类似的限制下一直做这样的事情,包括没有为其设计的专业工具的好处。这是一种方法:
首先创建一个临时 table 来保存 table 信息:
CREATE TABLE #DbSchemas(
DbName nvarchar(128) NULL,
Table_Name sysname NOT NULL,
[Column Name] sysname NULL,
[Data type] sysname NOT NULL,
[Max Length] smallint NOT NULL,
is_nullable bit NULL,
is_replicated bit NULL,
[Primary Key] bit NOT NULL
)
GO
然后将您已有的查询包装在未记录的系统过程中 sp_MSforeachdb
以在每个数据库上执行它,将结果添加到 #DbSchemas table:
EXECUTE master.sys.sp_MSforeachdb 'USE [?];
INSERT INTO #DbSchemas
SELECT DB_NAME() DbName, a.name Table_Name, c.name [Column Name],
t.Name [Data type],
c.max_length [Max Length],
c.is_nullable,a.is_replicated ,
ISNULL(i.is_primary_key, 0) [Primary Key]
FROM Sys.tables a inner join sys.columns c
On A.object_id=C.object_id
INNER JOIN
sys.types t ON c.user_type_id = t.user_type_id
LEFT OUTER JOIN
sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
LEFT OUTER JOIN
sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
Order by 1,2
;
';
go
现在您应该能够从#DbSchemas 中的任何数据库查询数据table:
select * from #DbSchemas where Dbname = 'master'
最后,要比较它们你可以使用这样的东西:
SELECT * FROM #DbSchemas s1
WHERE DbName = 'msdb'
AND NOT EXISTS(
SELECT * FROM #DbSchemas s2
WHERE s2.DbName = 'master'
AND s2.Table_Name = s1.Table_Name
AND s2.[Column Name] = s1.[Column Name]
AND s2.[Data type] = s1.[Data type]
AND s2.[Max length] = s1.[Max length]
AND s2.is_nullable = s1.is_nullable
AND s2.is_replicated = s1.is_replicated
AND s2.[Primary Key] = s1.[Primary Key]
)