【问题标题】:Sybase Adaptive Server IQ can't SELECT *, always limited to 30?Sybase Adaptive Server IQ 不能 SELECT *,总是限制为 30?
【发布时间】:2015-10-30 15:18:39
【问题描述】:

我在使用 PHP SQL Anywhere 扩展的 Sybase IQ 数据库(版本 SELECT @@version 显示 Adaptive Server IQ/12.5.0/0306)上遇到了这个问题。

我无法选择所有行,即SELECT * from anytable 总是返回 30 行

我发现的唯一解决方法是使用 SELECT TOP 1000 * from anytable(最大值为 32767),但在某些情况下我需要所有行。

非常感谢任何帮助。

EDIT:示例脚本(很像documentation

$conn = sasql_connect("HOST=host:port;DBN=dbn;UID=uid;PWD=pwd");
if (!$conn) { echo "Connection failed."; die(); }

$result = sasql_query($conn, "SELECT * FROM dba.anytable" );
sasql_result_all($result); // display 30 rows in a formatted table
sasql_free_result($result);
sasql_disconnect($conn);

编辑:我遇到完全相同的问题的两台机器的规格:

开发机器:

生产服务器:

【问题讨论】:

  • 很多 SQL 开发环境通过程序首选项来限制行数……虽然它默认为 30,但我不确定是否有任何程序开发人员会这样做。
  • @insidesin 确实可以,但我需要找到一种方法来选择所有行,不管有多重......
  • 我正在查看文档,还有另一个值 all 就像 TOP 作为参数,上面写着 includes all rows in the results. all is the default. try SELECT all FROM dba.anytable infocenter.sybase.com/help/index.jsp?topic=/…

标签: php sybase sqlanywhere sap-iq


【解决方案1】:

可能是一个愚蠢的问题,但只是为了确定。

您是否检查了客户端 --> 工具 -> Sybase IQ -> 要显示的最大行数。

(很抱歉将此作为答案发布,但我没有足够的代表在 cmets 中问你。)干杯

【讨论】:

  • 虽然这可能适用于客户端,但我认为它不会影响 PHP 连接和扩展...我会尽快尝试
  • “select count(*) from table”向您展示了什么,它是计算孔表还是仅计算 30 行?
  • 按预期计算整个表
  • 在客户端一切正常,select * from table 显示所有行?
  • 检查 php.ini 文件,看看是否有这行:sqlanywhere.row_counts=Off
【解决方案2】:

嗯,可能有一些可配置的属性可以将你从 30 的邪恶魔掌中解脱出来。我不知道那个财产在哪里。我希望有人能找到它。

但是,如果没有人这样做,这里有一个大技巧,它按给定表的主键排序,检索尽可能多的行给定您的约束,并跟踪最后获取的主键以检索下一批行。如果可用,最好将其调整为使用START ATLIMIT / OFFSET,但我假设它们不是。如果其中一个可用,您可以将此方法用于任何表。如果没有,这种方法可以适用于任何具有唯一非空键的表。

$conn = sasql_connect("HOST=host:port;DBN=dbn;UID=uid;PWD=pwd");
if (!$conn) {echo "Connection failed."; die(); }

$highest_id = -1;
$num_rows_retrieved = 0;

do {
  if (!sasql_real_query($conn, "SELECT TOP 32767 * FROM dba.anytable where anytable_id > $highest_id order by anytable_id")) {
    echo "Query failed.";
    die();
  }
  $result = sasql_use_result($conn);
  if (!$result) {
    echo "No result set.";
    die();
  }
  $num_rows_retrieved = 0;
  $num_fields = sasql_num_fields($result);
  while ($row = sasql_fetch_row($result)) {
    $highest_id = $row[0];  // assumes anytable_id is the first field
    $i = 0;
    while ($i < $num_fields) {
      echo "$row[$i]\t"; 
      $i++;
    }
    $num_rows_retrieved++;
    echo "\n";
  }
  sasql_free_result($result);
} while ($num_rows_retrieved == 32767);

sasql_disconnect($conn);

【讨论】:

  • 您能否提供一个示例 PHP 代码(如我在问题中的代码)以在执行查询之前设置行数?
  • @gremo 我不确定...我用在我的 Sybase IQ 实例中对我有用的方式更新了我的答案。希望其中一个可以在您的环境中使用sasql_querysasql_real_query。根据您的结果,我可以更新或撤回我的答案。另外,我不知道它是否适合您,但其中一个可能适用于 Sybase CT 扩展。 php.net/manual/en/book.sybase.php
  • 还是没有运气。我修改了脚本,现在查询是 set rowcount 0 SELECT * FROM dba.anytable: 仍然是 30 行。有趣的是,当我将它设置为小于 30 的数字时它可以工作(即 10),设置一个大于 30 的值并且它不起作用。
  • @gremo 这是奇怪的行为。但是你用SELECT TOP 得到超过 30 行?无论如何,我改变了我的答案,对行进行了比sasql_query / sasql_result_all 更多的手动迭代,我认为幕后可能存在隐藏的限制。你能试试我的代码示例吗?另外,我很想知道$num_rows 的输出。
  • 是的,实际上TOP n 是我必须选择更多行的唯一方法(我最多可以获得 32767)。您的示例输出:num_fields: 10 num_rows: -1,同时打印 30 行。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 2021-07-30
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多