【问题标题】:Does anyone know of a way to paginate a call to GetSchema from C#?有谁知道从 C# 对 GetSchema 的调用进行分页的方法?
【发布时间】:2016-12-16 01:14:57
【问题描述】:

我正在使用 ADO.NET 提供程序函数“GetSchema”从 Sql Server 数据库(以及 Informix 系统)中获取元数据,并想知道是否有任何方法可以对结果进行分页。我问是因为其中一个系统有超过 3,000 个表(是的,三千个)和两倍的视图,我们甚至不讨论存储过程。 毋庸置疑,对于我正在运行的 VM(仅 4GB 内存)来说,试图一次性删除该列表是太多了。我已经知道可以应用的限制,这些都是“dbo”模式中的所有表,所以在结果集到达我的客户端之前,我不知道有什么其他限制。

【问题讨论】:

  • 尝试使用SkipTake 方法使用LINQ
  • 如果您使用 INFORMATION_SCHEMA.Tables 代替,您可以编写自己的查询来检索部分结果

标签: c# sql-server pagination


【解决方案1】:

我建议不要使用 GetSchema,而是使用更灵活的 INFORMATION_SCHEMA 系统视图。这些视图已经划分了关于 Tables、StoredProcedures 和 Views 的信息,您可以编写特定的查询以分页方式检索您的数据。

例如,要检索表名的前 100 行,您可以编写这样的查询

SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY TABLE_NAME) AS RowNum, *
          FROM      INFORMATION_SCHEMA.TABLES
        ) AS TableWithRowNum
WHERE   RowNum >= 0
    AND RowNum < 100
ORDER BY RowNum

可以轻松准备以下查询,更改查询使用的最小值和最大值。

相同的代码可以应用于 StoredProcedures(使用 INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'PROCEDURE')或使用 INFORMATION_SCHEMA.VIEWS 的视图

注意,如果您使用的是 Sql Server 2012 及更高版本,则可以重写第一个查询以使用此语法

SELECT * 
FROM INFORMATION_SCHEMA.TABLES
ORDER BY TABLE_NAME 
OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY

C# 代码也可以使用 FIRST (0) 和 COUNT(100) 值的参数

【讨论】:

  • 我愿意,但我特别受到以下事实的限制:Microsoft 信息明确指出 INFORMATION_SCHEMA 不能用作以下事实的来源:“** 重要 ** 不要使用 INFORMATION_SCHEMA 视图来确定对象的架构。查找对象架构的唯一可靠方法是查询 sys.objects 目录视图。”可以在 this link 等示例页面上找到。我已经知道了,但它仍然没有回答这个问题:GetSchema 调用可以分页吗?
  • 那我觉得你倒霉了。 GetSchema(也具有使用限制的重载)似乎没有提供在结果之间进行分页的有用方法。或者返回的数据太多或结果太少。但是,您对 INFORMATION_SCHEMA 的“不可靠性”的观点开始对此进行搜索,这使我发现了 Aaron Bertrand 的 this interesting answer,其中讨论了 INFORMATION_SCHEMA 的“不可靠性”,并包含一些解决您问题的提示
猜你喜欢
  • 2010-12-14
  • 2022-12-20
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多