Zend_db SELECT с блэкдж... юнионами и вложенными запросами КАК?
/**
* Fetches a row from the result set.
*
* @param int $style OPTIONAL Fetch mode for this fetch operation.
* @param int $cursor OPTIONAL Absolute, relative, or other.
* @param int $offset OPTIONAL Number for absolute or relative cursors.
* @return mixed Array, object, or scalar depending on fetch mode.
* @throws Zend_Db_Statement_Exception
*/
public function fetch($style = null, $cursor = null, $offset = null)
{
if (!$this->_stmt) {
return false;
}
if (null === $style) {
$style = $this->_fetchMode;
}
$values = sqlsrv_fetch_array($this->_stmt, SQLSRV_FETCH_ASSOC); // <<<<< В ЭТОЙ ЕБАНОЙ СТРОКЕ
if (!$values && (null !== $error = sqlsrv_errors {
require_once 'Zend/Db/Statement/Sqlsrv/Exception.php';
throw new Zend_Db_Statement_Sqlsrv_Exception($error);
}
...
}
Файл sqlsrv.php
При подозрении на Real выполни сначала cast в sql-запросе и переведи все в строки.
При подозрении на Real выполни сначала cast в sql-запросе и переведи все в строки.REAL вполне ничего, просто читал про такой баг в sqlsrv
сейчас запрос выполняется 4-5 секунд
если там кастовать строки, то не увеличит ли это время выполнения запроса?
на самом деле нужен спец в зенде, который сможет популярно объяснить, как можно просто исполнить запрос и вернуть его в виде массива, а не трахаться с new Zend_Db_Expr, с составлением запросов по цепочке и ебаными эксепшионами на этапе формирования массива
самое поганое, что запрос проходит, затык в вытаскивании выходных данных
Просто проверь в real ли затык.
Тут - http://php5.kiev.ua/zend/zend.db.html читал?
P.S. В запросе наверно надо не UNION, а UNION ALL?
в понедельник попробую
проблема решилась просто переводом REAL в VARCHAR
SELECT TOP 100 Account_id, CAST(Honor AS varchar(15 AS Honor FROM ( ...
бред полный, зато работает
под freeTDS драйвером этот же запрос выкидывает следующее:
General error: 20018 Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS options to be set for the connection. This ensures consistent query semantics. Enable these options and then reissue your query.
что бы это означало?
да пробовал - не помогает
Если просто код, то попробуй сначала выполнить любой запрос на новой базе, а потом уже тестируй большой. Аналогично с процедурой.
просто запрос такой
обычные запросы проходят на ура (SELECT FROM WHERE, INSERT INTO, UPDATE и т.д.)
вот этот большой запрос работает на sqldrv драйвере, а под freeTDS не работает
чувствую, что лажа где-то тут находится:
... FROM [RU_World1].[dbo].[RoleData] ... UNION
... FROM [DB2].[RU_World3].[dbo].[RoleData] ...
сейчас запрос выполняется 4-5 секундв веб отдаешь, или в кеш?
в любом случае при таком времени выполнения и ограничении в 100 результатов можно или временную таблицу заюзать с выборкой или тупо в коде массив из 400 элементов сортирнуть.
в веб отдаешь, или в кеш?сейчас остановился на следующем варианте:
в любом случае при таком времени выполнения и ограничении в 100 результатов можно или временную таблицу заюзать с выборкой или тупо в коде массив из 400 элементов сортирнуть.
каждые 5 минут по крону исполняется скрипт, в нем 4 запроса к 4м игровым бд, выбирающие по 100 топовых результата, результаты складыаются в сайтовую бд (т.е. каждые 5 минут данные апдейтятся
в модельке делается запрос к сайтовой бд вывести 100 топовых из 400, результаты кэшируются в memchache с временем протухания в минуту
все работает идельно
Оставить комментарий
PooH
заебался, господаКак пользоваться этим MSSQL, с этим их sqlsrv драйвером, даеще под этим ебаным Зендом
все, что мне надо - выполнить вот такой запрос
и вернуть результат в виде массива
попытки использовать зендовский метод fetchAll упирались в кидаемый sqlsrv драйвером эксепшен: "Numeric value out of range" (я так подозреваю, все из-за того, что Honor в виде REAL)
при всем при этом через SQL консоль все ок - возвращается 100 строк
помогите побороть эту хуйню