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 查询不返回数据集