首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MSSQL模式与MSSQL的比较

MSSQL模式与MSSQL的比较
EN

Stack Overflow用户
提问于 2016-07-29 14:16:45
回答 1查看 105关注 0票数 1

我在同一台服务器上有21个DB,它们“应该”具有相同的模式(到目前为止,只能将模式限制在表模式上),但它们没有。在我所处的环境中,我无法按照遵从性规则安装任何工具/应用程序。我唯一能想到的方法是,提取excel中所有21个DB的架构,并进行比较,但是比较起来很乏味。

有人能指导我开发一个the,它可以比较所有21个DB的模式并突出区别吗?

这些是我需要的列: Table_Name、列名、数据类型、最大长度、is_nullable、is_replicated、主键

下面的T在我的信息中提取了这个信息。我需要一些关于如何比较21个DBs的这些信息的一些想法。

代码语言:javascript
复制
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

我需要一个起点

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-29 15:05:35

我不得不一直在类似的约束下做这样的事情,包括没有为它设计的专业工具的好处。有一种方法:

首先创建一个临时表来保存表信息:

代码语言:javascript
复制
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表中:

代码语言:javascript
复制
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表中的任何数据库查询数据:

代码语言:javascript
复制
select * from #DbSchemas where Dbname = 'master'

最后,为了比较它们,您可以使用如下内容:

代码语言:javascript
复制
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]
      )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38661083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档