Oznámení
Nefungující sql v datasource
před 9 lety
- blacksun
- Člen | 181
Ahoj,
mám následující sql dotaz, který puštěný přes mssql studio normálně proběhne:
<?php
$query = "
SELECT
[rir].[RunInResultID] ,
[rir].[RunInStatus],
[rir].[RunInFailure],
[rir].[RunInPassedShortCircuit],
[rir].[RunInShortCircuitValue],
[rir].[RunInPassedMotorOrientation],
[rir].[RunInTimeGroupName],
[rir].[RunInEnvironmentTemp],
convert(char,[rir].[RunInTestTimeStart],120) as [RunInTestTimeStart],
convert(char,[rir].[RunInTestTimeEnd],120) as [RunInTestTimeEnd],
[e].[OSC] as [RunInOperatorOSC],
[e].[Name] as [RunInOperatorName],
[stds].[StandName] as [RunInStandName],
[rir].[PotPresent],
[rir].[UnitID],
[units].[UnitBarCode] as [UnitBarCode],
[ubcs].[ModelNumber] as [ModelNumber],
[rir].[TestProfileID],
[tps].[Name] as [TestProfileName]
FROM
[tbRunInResults] rir
INNER JOIN
[tbOperators] [ops]
ON [rir].[RunInOperatorID] = [ops].[OperatorID]
INNER JOIN
[vwEmployees] e
ON [e].[EmployeeId] = [ops].[EmployeeID]
INNER JOIN
[tbStands] stds
ON [rir].[RunInStandID] = [stds].[StandID]
INNER JOIN
[tbTestProfiles] tps
ON [rir].[TestProfileID] = [tps].[TestProfileID]
INNER JOIN
[tbUnitStatus] units
ON [rir].[UnitID] = [units].[UnitID]
INNER JOIN
[vwUnitBarCodes] ubcs
ON [units].[UnitBarCode] = [ubcs].[UnitBarCode]
";
?>
, použitý v nette ve funkci přes
<?php
return new DibiDataSource($query,$this->connection);
?>
ale padá při pokusu spočítat celkový počet řádků. Laděnka hlásí chybu DibiDriverException:Query error, ale nevím, kde hledat, když po copy-paste do mssql studia to jede ok.
Díky za případné nakopnutí.
Michal
před 9 lety
- David Grudl
- Nette Core | 6806
Vypiš si SQL z té výjimky a zjisti, co v něm zlobí.
před 9 lety
- blacksun
- Člen | 181
Právě to, co jsem postnul jako ten dotaz, je to, co dostanu dole na stránce výjimky z Laděnky.. Když to odtamtud zkopíruju rovnou do sql studia, tak to normálně projde..
před 9 lety
- blacksun
- Člen | 181
Tak jsem zjistil, že problém nastává v případě, že select je
z tabulek joinovaných s view. Pokud select nahradím view nad tou samou
tabulkou, funguje to, ale pokud použiju view, kde je join na další view,
nefunguje to.
Práva jsou všude nastavena ok, pod tím samým uživatelem přes management
studio dotaz, který zkopíruju z laděnky jako „chybný“, bez problémů
funguje.
Nenapadá někoho, v čem by mohl být problém? Řešením by bylo dotaz přepsat bez view, ale právě od toho přeci jsou, aby zjednodušily dotazy.
před 9 lety
- blacksun
- Člen | 181
Tak problém vyřešen. Heterogenní view je potřeba vytvářet s nastavením
SET ANSI_NULLS ON
SET ANSI_WARNINGS ON
, stejně tak se před voláním dibi selectu musí zavolat nastavení spojení v query pomocí
<?php
dibi::query('SET ANSI_NULLS ON');
dibi::query('SET ANSI_WARNINGS ON');
?>
a pak vše už funguje tak, jak by člověk očekával.
Problém jsem odhalil tak, že jsem si do mssql.php driveru dibi vložil funkci mssql_get_last_message(), která mi odhalila hlášku serveru. Bylo by možné ji zakomponovat do vyhazování výjimky, aby bylo jasné, proč chyba vznikla?
BlackSUN
před 9 lety
- David Grudl
- Nette Core | 6806
mssql_get_last_message() je tam.