首页 > 解决方案 > 当您通过将结果限制为 500 条记录且表没有主键的 API 访问时,如何从表中提取每一行?

问题描述

我们的 CRM 有一个 API,允许我们运行 SQL 查询,但将结果限制为 500 条记录。我们需要从具有超过 500 条记录的某些表中获取每一行。

到目前为止,我对某些表的解决方法是查询最低主键、最高主键,然后按主键一次运行 500 条记录的查询,并不断重复和添加每个结果集,直到达到最高的主键(然后将所有这些表加在一起)。但是有些表没有主键。有没有办法一次提取 500 条记录,直到整个表都被拉出?这是 SQL 服务器。

lowestPKQuery = "SELECT TOP 1 " + pkColumn + " FROM " + tableToDump + "ORDER BY " + pkColumn + " ASC";


highestPKQuery = "SELECT TOP 1 " + pkColumn + " FROM " + tableToDump + " ORDER BY " + pkColumn + " DESC";

initialRecordCountQuery = "SELECT count(" + pkColumn + ") FROM " + tableToDump;

// then, populate a dictionary that covers every range by intervals of 500

query = "SELECT " + columnsToSelect + " FROM " + tableToDump + " WHERE " + pkColumn + " BETWEEN " + range.Key + " AND " + range.Value + " ORDER BY " + pkColumn + " ASC";

// after all the tables have been pulled, then add all of those tables together

在没有主键的情况下,有没有办法只使用 SQL 最终拉取整个表,一次 500 条记录?它基本上是一个 REST API,它允许我们运行几乎任何 SQL 语句(除了记录删除或表创建),但无论什么查询,它只会返回 500 条记录(在 XML 文档中)。

标签: sqlsql-server

解决方案


如果您正在使用and ,您可以使用FETCHand从旧版本中获取数据。OFFSETSQL Server 2012+ROW_NUMBER()

您可以尝试如下查询来获取数据。

带有主键的表

SELECT *   
FROM
    <Your_Table>
ORDER BY
    pkColumn  
OFFSET 0 ROWS 
FETCH NEXT 500 ROWS ONLY

现在继续增加OFFSET500 直到你没有得到任何记录。

没有主键的表

对于没有任何主键的表,你需要有一个适当的列,ORDER BY它可以是日期列或多列的组合,否则这种方法将不起作用。

例如

SELECT *   
FROM
    <Your_Table>
ORDER BY
    CreatedDate
OFFSET 0 ROWS 
FETCH NEXT 500 ROWS ONLY

推荐阅读