sqlsrv_query выполняет не возвращая результат, но результат существует, когда код выполняется в диспетчере SQL - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь выполнить приведенный ниже код, но по какой-то причине он не возвращает никакого результата, не сообщает об ошибках, и я не могу понять, почему. Когда я вставляю запрос непосредственно в SQL Manager, он выполняется, и я получаю желаемый результат.

Я предполагаю, что это что-то с sqlsrv_query, которое интерпретирует по-разному, но я не могу понять, почему.

Это впервые; Я пытаюсь сделать это с помощью PHP, поэтому я изо всех сил, и я был бы признателен, если кто-нибудь может указать мне в правильном направлении.

 $sql = "DECLARE @YearsToPass INT
    SET @YearsToPass = 10;
    WITH cte AS
    (
    SELECT DATEPART(YY, GETDATE())- @YearsToPass + 1 as Years
    UNION ALL
    SELECT Years + 1 as Years
    FROM cte
    WHERE Years + 1 <= YEAR(GETDATE())
    )

    SELECT cte.Years, DATEFROMPARTS(cte.Years, 12, 31),  SUM(Inv.[Nabavna vrijednost])
    FROM cte
    left join  [Drezga01].[dbo].[BI_Inventory01] Inv on Inv.[Datum knjiženja] <= DATEFROMPARTS(cte.Years, 12, 31)
    group by cte.Years, DATEFROMPARTS(cte.Years, 12, 31)
    ORDER BY cte.Years DESC";
 $query = sqlsrv_query($conn_bi,$sql);
 //error handling
 if( $query === false ) {
    if( ($errors = sqlsrv_errors() ) != null) {
     foreach( $errors as $error ) {
     echo "SQLSTATE: ".$error[ 'SQLSTATE']."<br />";
     echo "code: ".$error[ 'code']."<br />";
     echo "message: ".$error[ 'message']."<br />";
     }
   }
  }
while($row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC)){
$zaliha_array[] = array('godina' => $row['godina'],
                        'zaliha' => abs($row['nabava']));
}

 debugVar($zaliha_array);

Массив пуст, но об ошибках не сообщается. Результат существует и возвращается при выполнении запроса в SQL Management Studio. Есть идеи?

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Вы генерируете оператор, который не имеет псевдонимов столбцов для DATEFROMPARTS(cte.Years, 12, 31) и SUM(Inv.[Nabavna vrijednost]), и использование sqlsrv_fetch_array () с SQLSRV_FETCH_ASSOC является одной из возможных причин ваших неожиданных результатов. Попробуйте извлечь данные с опцией SQLSRV_FETCH_NUMERIC, чтобы получить каждую строку набора результатов в виде числового индекса:

<?php
$sql = "
    DECLARE @YearsToPass INT
    SET @YearsToPass = 10;

    WITH cte AS
    (
        SELECT DATEPART(YY, GETDATE())- @YearsToPass + 1 as Years
        UNION ALL
        SELECT Years + 1 as Years
        FROM cte
        WHERE Years + 1 <= YEAR(GETDATE())
    )

    SELECT cte.Years, DATEFROMPARTS(cte.Years, 12, 31),  SUM(Inv.[Nabavna vrijednost])
    FROM cte
    left join  [Drezga01].[dbo].[BI_Inventory01] Inv on Inv.[Datum knjiženja] <= DATEFROMPARTS(cte.Years, 12, 31)
    group by cte.Years, DATEFROMPARTS(cte.Years, 12, 31)
    ORDER BY cte.Years DESC
";

$query = sqlsrv_query($conn_bi, $sql);
if ($query === false ) {
    print_r(sqlsrv_errors(), true);
    exit;
}

while($row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_NUMERIC)){
    $zaliha_array[] = array(
        'godina' => $row[0],
        'zaliha' => abs($row[2])
    );
}
debugVar($zaliha_array);
?>
0 голосов
/ 19 апреля 2019

У вас есть некоторые требования для правильной работы этой связи:

  1. Необходимо проверить требования к операционной системе, версию сервера sql и версию php.Затем вы скачиваете драйвер для вашей версии php.Эта ссылка может помочь вам в этом шаге Системные требования для драйверов Microsoft

  2. Загрузите и установите драйвер ODBC. Вы можете скачать ODBC Driver здесь

  3. Укажите ссылки на драйверы, которые вы скачали в php.ini, где расширения , как показано на этом рисунке

    Obs: не забудьте взять ';'перед расширением слова

    . Obs: не забывайте, что файлы драйверов должны находиться в каталоге php / ext, где находятся драйверы php

  4. . Наконец, используйтеФункция phpinfo () и убедитесь, что расширение pdo_sqlsrv было загружено. он должен оставаться таким:

Надеюсь, это поможет решить проблему o /

...