【问题标题】:SQL Server :: create an ERD from a database without constraintsSQL Server :: 从无约束的数据库创建 ERD
【发布时间】:2021-11-16 20:02:34
【问题描述】:

我有一个没有限制、没有 PK 或 FK 的数据库。

我正在尝试进行逆向工程以找出表之间的连接。为此,我的方法是创建具有相同名称和数据类型的所有列的列表。所以我创建了这个查询:

SELECT schema_name(tab.schema_id) AS schema_name
    ,tab.name AS table_name
    ,col.name AS column_name
    ,t.name AS data_type
    ,SUM([Partitions].[rows]) AS [TotalRowCount]
    
FROM sys.tables AS tab
INNER JOIN sys.columns AS col ON tab.object_id = col.object_id
LEFT JOIN sys.types AS t ON col.user_type_id = t.user_type_id
JOIN sys.partitions AS [Partitions] ON tab.[object_id] = [Partitions].[object_id]
    AND [Partitions].index_id IN (
        0
        ,1
        )

GROUP BY schema_name(tab.schema_id)
    ,tab.name
    ,col.name
    ,t.name
    
ORDER BY col.name 

结果我有这个:

schema_name table_name column_name data_type TotalRowCount
H513WEB ALPRETAR IDREVI numeric 1439
H513WEB ALPRETAR IDREVN numeric 1439
H513WEB CPDOENP IDRLPP numeric 4156
H513WEB ALPRETAR IDRNG numeric 1439
H513WEB FAAFACP IDROLDEBCOM numeric 100541
H513WEB FAAFACP_OLD IDROLDEBCOM numeric 1513
H513WEB CACPTAP IDROLE numeric 22109
H513WEB CARROLP IDROLE numeric 5
H513WEB FAENTFP IDROLE numeric 26084
H513WEB CACPTCP IDRUBRIQUE numeric 48
H513WEB CACPTRP IDRUBRIQUE numeric 12942
H513WEB CAIMDCP IDRUBRIQUE numeric 6637
H513WEB CAIMGIP IDRUBRIQUE numeric 5
H513WEB CAIMRSP IDRUBRIQUE numeric 40
H513WEB CAOREXP IDRUBRIQUE numeric 5
H513WEB CAPLARP IDRUBRIQUE numeric 3
H513WEB CARERUP IDRUBRIQUE numeric 175
H513WEB CARUBRP IDRUBRIQUE numeric 312

但我只想列出具有相同 column_namedata_type 的行,结果应如下所示:

schema_name table_name column_name data_type TotalRowCount
H513WEB FAAFACP IDROLDEBCOM numeric 100541
H513WEB FAAFACP_OLD IDROLDEBCOM numeric 1513
H513WEB CACPTAP IDROLE numeric 22109
H513WEB CARROLP IDROLE numeric 5
H513WEB FAENTFP IDROLE numeric 26084
H513WEB CACPTCP IDRUBRIQUE numeric 48
H513WEB CACPTRP IDRUBRIQUE numeric 12942
H513WEB CAIMDCP IDRUBRIQUE numeric 6637
H513WEB CAIMGIP IDRUBRIQUE numeric 5
H513WEB CAIMRSP IDRUBRIQUE numeric 40
H513WEB CAOREXP IDRUBRIQUE numeric 5
H513WEB CAPLARP IDRUBRIQUE numeric 3
H513WEB CARERUP IDRUBRIQUE numeric 175
H513WEB CARUBRP IDRUBRIQUE numeric 312

怎么做?

【问题讨论】:

  • 嗨@Larnu,我写了一篇关于您的查询以及它如何帮助我找到解决方案的帖子:jeeja.biz/2021/11/10/…。你认为我可以将我的问题重命名为“将 SQL Server 数据库反向工程为 ERD”吗?因为它现在的标题有点误导。谢谢
  • 您可以随时edit您自己的问题,除非它被锁定。只是让陛下不要做诸如使现有答案无效之类的事情。

标签: sql-server tsql constraints reverse-engineering unique-constraint


【解决方案1】:

如果您尝试识别 PK 和 FK 候选对象,不仅需要匹配的数据类型,还需要匹配长度、比例和精度。例如,varchar(10) 不能是 varchar(8) 的外键。实际上,名称根本不需要匹配,但如果不包括它,最终会出现大量误报。

我已经猜到了你想要什么,但我认为这可能是正确的。另一方面,(估计的)行数似乎根本不需要,所以我从查询中删除了它:

WITH ColumnCount AS(
    SELECT s.name AS SchemaName,
           t.name AS TableName,
           c.name AS ColumnName,
           ct.[name] AS DataType,
           c.max_length,
           c.precision,
           c.scale,
           COUNT(c.column_id) OVER (PARTITION BY c.[name], ct.[name], c.max_length, c.precision, c.scale) AS Duplicates
    FROM sys.schemas s
         JOIN sys.tables t ON s.schema_id = t.schema_id
         JOIN sys.columns c ON t.object_id = c.object_id
         JOIN sys.types ct ON c.user_type_id = ct.user_type_id)
SELECT *
FROM ColumnCount CC
WHERE CC.Duplicates > 1
ORDER BY CC.ColumnName,
         CC.SchemaName,
         CC.TableName;

【讨论】:

  • “重复”列是什么?我不明白。谢谢
  • 它在 CTE 中定义,@FrancescoMantovani。 COUNT 按列名和数据类型(由名称、长度、比例和精度组成)分区。
  • 谢谢,我知道在哪里定义了,但我不明白你为什么要计算和分区 ´c.[name], ct.[name], c.max_length, c.precision, c 。规模。假设一行有 12 个重复项,另一行有 6 个重复项。这一列的建议是什么?
  • 啊,我明白了,也许你的意思是有 12 或 6 列这样的列具有相同的 ´c.[name], ct.[name], c.max_length, c.precision, c.scale´?
  • 没错,@FrancescoMantovani。
猜你喜欢
  • 2011-06-27
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多