Zend_db SELECT с блэкдж... юнионами и вложенными запросами КАК?

PooH

заебался, господа
Как пользоваться этим MSSQL, с этим их sqlsrv драйвером, даеще под этим ебаным Зендом
все, что мне надо - выполнить вот такой запрос
 
 
SELECT TOP(100) * FROM
(SELECT TOP 100 Account_id, Honor FROM [RU_World1].[dbo].[RoleData] ORDER BY Honor DESC
UNION
SELECT TOP 100 Account_id, Honor FROM [DB2].[RU_World3].[dbo].[RoleData] ORDER BY Honor DESC
UNION
SELECT TOP 100 Account_id, Honor FROM [DB2].[RU_World4].[dbo].[RoleData] ORDER BY Honor DESC
UNION
SELECT TOP 100 Account_id, Honor FROM [DB3].[RU_World2].[dbo].[RoleData] ORDER BY Honor DESC
) a
ORDER BY Honor DESC

и вернуть результат в виде массива
попытки использовать зендовский метод fetchAll упирались в кидаемый sqlsrv драйвером эксепшен: "Numeric value out of range" (я так подозреваю, все из-за того, что Honor в виде REAL)
при всем при этом через SQL консоль все ок - возвращается 100 строк
помогите побороть эту хуйню

PooH

как показывает ebug все опадает на вот этой строчке
 
 
/**
* 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

0000

При подозрении на Real выполни сначала cast в sql-запросе и переведи все в строки.

PooH

При подозрении на Real выполни сначала cast в sql-запросе и переведи все в строки.
REAL вполне ничего, просто читал про такой баг в sqlsrv
сейчас запрос выполняется 4-5 секунд
если там кастовать строки, то не увеличит ли это время выполнения запроса?
на самом деле нужен спец в зенде, который сможет популярно объяснить, как можно просто исполнить запрос и вернуть его в виде массива, а не трахаться с new Zend_Db_Expr, с составлением запросов по цепочке и ебаными эксепшионами на этапе формирования массива
самое поганое, что запрос проходит, затык в вытаскивании выходных данных

0000

Сильно грузить cast вряд ли будет. Основная работа - это просмотр таблицы на наличие подходящих записей.
Просто проверь в real ли затык.
Тут - http://php5.kiev.ua/zend/zend.db.html читал?
P.S. В запросе наверно надо не UNION, а UNION ALL?

PooH

Запрос сам нормально обрабатывается, если через клиент его запустить
в понедельник попробую

PooH

спасибо зубастику
проблема решилась просто переводом REAL в VARCHAR
 SELECT TOP 100 Account_id, CAST(Honor AS varchar(15 AS Honor FROM ( ... 

бред полный, зато работает

PooH

теперь новая беда
под 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.  

что бы это означало?

0000

Гулить пробовал?
http://www.sql.ru/forum/actualthread.aspx?tid=56777

PooH

да пробовал - не помогает

0000

У тебя хранимая или что? Если хранимая, то надо пересоздать.
Если просто код, то попробуй сначала выполнить любой запрос на новой базе, а потом уже тестируй большой. Аналогично с процедурой.

PooH

нет, не хранимая
просто запрос такой
обычные запросы проходят на ура (SELECT FROM WHERE, INSERT INTO, UPDATE и т.д.)
вот этот большой запрос работает на sqldrv драйвере, а под freeTDS не работает
чувствую, что лажа где-то тут находится:
 
... FROM [RU_World1].[dbo].[RoleData] ... UNION
... FROM [DB2].[RU_World3].[dbo].[RoleData] ...

stm7884696

сейчас запрос выполняется 4-5 секунд
в веб отдаешь, или в кеш?
в любом случае при таком времени выполнения и ограничении в 100 результатов можно или временную таблицу заюзать с выборкой или тупо в коде массив из 400 элементов сортирнуть.

PooH

в веб отдаешь, или в кеш?
в любом случае при таком времени выполнения и ограничении в 100 результатов можно или временную таблицу заюзать с выборкой или тупо в коде массив из 400 элементов сортирнуть.
сейчас остановился на следующем варианте:
каждые 5 минут по крону исполняется скрипт, в нем 4 запроса к 4м игровым бд, выбирающие по 100 топовых результата, результаты складыаются в сайтовую бд (т.е. каждые 5 минут данные апдейтятся
в модельке делается запрос к сайтовой бд вывести 100 топовых из 400, результаты кэшируются в memchache с временем протухания в минуту
все работает идельно
Оставить комментарий
Имя или ник:
Комментарий: