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

Posted

技术标签:

【中文标题】sqlsrv_query 执行不返回结果,但在 sql manager 中执行代码时结果存在【英文标题】:sqlsrv_query executing not returning result, but result exists when code executed in 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;。谢谢。 不,没有错误。但也没有结果?我不知道为什么。 【参考方案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】:

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

    需要查看操作系统要求,sql server版本和php版本。然后你下载你的php版本的驱动程序。此链接可以帮助您完成此步骤System requirements for the microsoft drivers

    下载并安装 ODBC 驱动程序。 You can download ODBC Driver here

    引用您在 php.ini 中下载的驱动程序,其中扩展名是 as this picture shows

    Obs:不要忘记带“;”在词扩展之前

    Obs:不要忘记驱动文件需要在php / ext目录中,这是php驱动所在的目录

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

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

【讨论】:

如果我的问题具有误导性,我很抱歉,但我与 MS SQL 的连接正常。我能够执行 SELECT、UPDATE、INSERT、DELETE 查询。只有上面的查询对我来说是个问题,那个没有返回任何东西。

以上是关于sqlsrv_query 执行不返回结果,但在 sql manager 中执行代码时结果存在的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中使用带有 sqlsrv_query 函数的临时表不会产生任何结果

使用 WITH XMLNAMESPACES 的 s-s-rS 查询不返回数据集

sqlsrv_num_rows 不返回任何值

PHP sql查询不返回表格内容

PHP:PDO查询不返回结果,但在phpmyadmin中同样的查询返回4个结果?

setInterval如何在结束后返回执行结果?