【问题标题】:sqlsrv_query executing not returning result, but result exists when code executed in sql managersqlsrv_query 执行不返回结果,但在 sql manager 中执行代码时结果存在
【发布时间】:2019-04-19 19:29:39
【问题描述】:

我正在尝试执行下面的代码,但由于某种原因,它没有返回任何结果,也没有报告任何错误,我不知道为什么。当我将查询直接粘贴到 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 中执行查询时,结果存在并返回。有什么想法吗?

【问题讨论】:

  • 你能做一个小测试并用这个错误检查来执行你的脚本吗:$query = sqlsrv_query($conn_bi, $sql); if ($query === false ) {print_r(sqlsrv_errors(), true); exit;}。谢谢。
  • 不,没有错误。但也没有结果?我不知道为什么。

标签: php sql-server sqlsrv


【解决方案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);
?>

【讨论】:

  • 看准了!我刚刚为列添加了别名,它就像一个魅力。不敢相信它是如此简单,我花了几个小时试图弄清楚发生了什么。非常感谢@Zhorov!
  • @BudimirSkrtic 我很高兴为您提供帮助。祝你好运!
【解决方案2】:

您有一些要求才能使这种通信正常工作:

  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 / ext目录中,这是php驱动所在的目录

  4. 最后使用 phpinfo() 函数并验证 pdo_sqlsrv 扩展是否已加载。 he should stay like this

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

【讨论】:

  • 如果我的问题具有误导性,我很抱歉,但我与 MS SQL 的连接正常。我能够执行 SELECT、UPDATE、INSERT、DELETE 查询。只有上面的查询对我来说是个问题,那个没有返回任何东西。
猜你喜欢
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
  • 2012-08-10
  • 2018-06-21
  • 2018-12-31
相关资源
最近更新 更多