sqlsrv_query执行不返回结果,但在sql管理器中执行代码时结果存在
sqlsrv_query executing not returning result, but result exists when code executed in sql manager
我正在尝试执行下面的代码,但由于某种原因,它没有返回任何结果,也没有报告任何错误,而且我不明白为什么。当我将查询直接粘贴到 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 中执行查询时返回。有什么想法吗?
要使此通信正常工作,您有一些要求:
您需要检查操作系统要求、sql 服务器版本和 php 版本。然后下载适合您 php 版本的驱动程序。这个link可以帮你完成这一步System requirements for the microsoft drivers
下载并安装 ODBC 驱动程序。 You can download ODBC Driver here
参考您在 php.ini 下载的驱动程序
如图所示
Obs:不要忘记带上“;”在单词 extension
之前
Obs:不要忘记驱动程序文件需要位于 php / ext 目录中,这是 php 驱动程序所在的目录
最后使用phpinfo()函数,验证pdo_sqlsrv扩展是否已经加载。 他应该一直这样
我希望这有助于解决问题 o/
您生成的语句没有 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);
?>
我正在尝试执行下面的代码,但由于某种原因,它没有返回任何结果,也没有报告任何错误,而且我不明白为什么。当我将查询直接粘贴到 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 中执行查询时返回。有什么想法吗?
要使此通信正常工作,您有一些要求:
您需要检查操作系统要求、sql 服务器版本和 php 版本。然后下载适合您 php 版本的驱动程序。这个link可以帮你完成这一步System requirements for the microsoft drivers
下载并安装 ODBC 驱动程序。 You can download ODBC Driver here
参考您在 php.ini 下载的驱动程序 如图所示
Obs:不要忘记带上“;”在单词 extension
之前Obs:不要忘记驱动程序文件需要位于 php / ext 目录中,这是 php 驱动程序所在的目录
最后使用phpinfo()函数,验证pdo_sqlsrv扩展是否已经加载。 他应该一直这样
我希望这有助于解决问题 o/
您生成的语句没有 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);
?>