Sybase Adaptive Server IQ не может SELECT *, всегда ограничен 30?
У меня эта проблема с базой данных Sybase IQ (версия SELECT @@version
показывает Adaptive Server IQ/12.5.0/0306) с использованием расширения PHP SQL Anywhere.
Я не могу выбрать все строки, т.е. SELECT * from anytable
всегда возвращает 30 строк.
Единственным обходным решением, которое я нашел, является использование SELECT TOP 1000 * from anytable
(максимум 32767), но есть определенные ситуации, когда мне нужны все строки.
Любая помощь очень ценится.
РЕДАКТИРОВАТЬ: пример script (как документация )
$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);
EDIT: спецификации обеих машин, где я испытываю ту же самую проблему:
Машина разработки:
Производственный сегмент:
Ответы
Ответ 1
Наверное, глупый вопрос, но, чтобы быть уверенным.
Вы проверили Client → Tools → Sybase IQ → Максимальное количество строк для отображения.
(sry для публикации этого ответа, но у меня нет достаточного количества отзывов, чтобы спросить вас в комментариях.) Cheers
Ответ 2
Ну, возможно, есть кое-что конфигурируемое свойство, которое освободит вас от злых кладок 30. Я не знаю, где это свойство. Я надеюсь, что кто-то найдет это.
В случае, если никто этого не делает, вот большой взлом, который заказывает первичный ключ данной таблицы, извлекает столько строк, сколько может дать ваши ограничения, и отслеживает последний выбранный первичный ключ для извлечения следующая партия строк. Было бы лучше адаптировать это, чтобы использовать START AT
или LIMIT
/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);