sqlsrv_query执行不返回结果,但在sql管理器中执行代码时结果存在

问题描述 投票:0回答:2

我正在尝试执行下面的代码,但由于某种原因,它没有返回任何结果,它没有报告任何错误,我无法弄清楚为什么。当我将查询直接粘贴到SQL管理器时,它被执行,我得到了所需的结果。

我认为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中执行查询时返回。有任何想法吗?

php sql-server sqlsrv
2个回答
1
投票

你生成语句,没有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
投票

您有一些要求此通信正常工作:

  1. 您需要检查操作系统要求,sql server版本和php版本。然后你下载你的PHP版本的驱动程序。此链接可以帮助您完成此步骤System requirements for the microsoft drivers
  2. 下载并安装ODBC驱动程序。 You can download ODBC Driver here
  3. 参考您在php.ini中下载的驱动程序,其中扩展名为as this picture shows Obs:别忘了带';'在单词扩展之前 Obs:不要忘记驱动程序文件需要位于PHP驱动程序所在的php / ext目录中
  4. 最后使用phpinfo()函数并验证是否已加载pdo_sqlsrv扩展。 he should stay like this

我希望这有助于解决问题o /

© www.soinside.com 2019 - 2024. All rights reserved.