首页 > 解决方案 > 为什么这个迭代是在一个列表上没有从 SQL 视图中给我正确的值?

问题描述

我正在开发一个必须在数据网格中显示表格的新应用程序。数据网格的列由我的一位同事编写的 SQL 视图检索。但是,返回的数据看起来像重复数据,例如,如果 SQL 查询格式不正确,您会得到这样的数据。下面是定义 SQL 视图的代码:

Create view [Core].[vwDataDictionary] as
SELECT ROW_NUMBER() OVER(order by A.[TABLE_CATALOG]) AS [ID]   
      ,A.[TABLE_CATALOG]
      ,A.[TABLE_SCHEMA]
      ,A.[TABLE_NAME]
      ,A.[COLUMN_NAME]
      ,[ORDINAL_POSITION]
      ,[COLUMN_DEFAULT]
      ,[IS_NULLABLE]
      ,[DATA_TYPE]
      ,[CHARACTER_MAXIMUM_LENGTH]
      ,[CHARACTER_OCTET_LENGTH]
      ,[NUMERIC_PRECISION]
      ,[NUMERIC_PRECISION_RADIX]
      ,[NUMERIC_SCALE]
      ,[DATETIME_PRECISION]
      ,[CHARACTER_SET_CATALOG]
      ,[CHARACTER_SET_SCHEMA]
      ,[CHARACTER_SET_NAME]
      ,[COLLATION_CATALOG]
      ,[COLLATION_SCHEMA]
      ,[COLLATION_NAME]
      ,[DOMAIN_CATALOG]
      ,[DOMAIN_SCHEMA]
      ,[DOMAIN_NAME]
      ,B.[CONSTRAINT_NAME]
      ,C.[CONSTRAINT_TYPE]
  FROM [INFORMATION_SCHEMA].[COLUMNS] AS A
  left join
  [INFORMATION_SCHEMA].[CONSTRAINT_COLUMN_USAGE] AS B
  on A.TABLE_NAME = B.TABLE_NAME and A.COLUMN_NAME = B.COLUMN_NAME
  left join
  [INFORMATION_SCHEMA].[TABLE_CONSTRAINTS] AS C
  on B.CONSTRAINT_NAME = C.CONSTRAINT_NAME
  where A.[TABLE_SCHEMA] = 'App'

但是,数据网格显示如下数据:

在此处输入图像描述

所以,我决定通过创建一个控制台应用程序来简化事情,只从视图中提取数据并迭代返回的内容。我首先在现有数据库中使用了 EF 的代码。这是控制台应用程序的代码:

class Program
{
    static void Main(string[] args)
    {
        using (var ctx = new CodeModel())
        {
            var bozo = ctx.vwDataDictionaries.ToList();
            int i = 0;
            foreach (var item in bozo)
            {
                i++;
                Console.WriteLine($"i: {i}, ID: {item.ID}, TABLE_NAME: {item.TABLE_NAME}, COLUMN_NAME: {item.COLUMN_NAME}");
            }
        }
        Console.WriteLine("Finished");
    }
}

但是如果我运行那个控制台应用程序,我会得到这样的值:

在此处输入图像描述

在 C# 应用程序中运行查询会返回 282 条记录。都有一个列名“ID”。但是,如果我在 Azure Data Studio 中运行相同的查询,我会得到以下信息:

在此处输入图像描述

当然,我知道我没有进行排序或过滤,但我仍然不明白为什么示例程序会为 COLUMN_NAME 返回这么多重复项。

我正在使用 VS 2019 版本 16.8.2。.NET 框架 4.5.2 和 EF 6。

标签: c#sql-servervisual-studioentity-framework

解决方案


我不确定您到底在期待什么,但列可以有多个约束。看起来您正在获取整个架构中所有列的列表,而不是单个表的列。

如果您查看查询中的三个表中的每一个;

select * from [INFORMATION_SCHEMA].[COLUMNS] order by table_schema, TABLE_NAME
select * from [INFORMATION_SCHEMA].[CONSTRAINT_COLUMN_USAGE] order by table_schema, TABLE_NAME
select * from [INFORMATION_SCHEMA].[TABLE_CONSTRAINTS] order by table_schema, TABLE_NAME

您可能会更好地了解与您的期望不同的地方。


推荐阅读