我们正在将一些PHP 5.3内部API代码转换为PHP 7.2。转换过程的一部分是从使用mssql_ * DB API切换到使用sqlsrv_ * DB API。我们发现的一件事是旧的MSSQL_EXECUTE语句忽略了我们在存储过程中的任何T-SQL Print语句,但新的SQLSRV_QUERY语句却没有。
例如,我有以下示例存储过程:
create procedure spTestPrintStmt
@var1 varchar(50),
@var2 varchar(50),
@var3 varchar(50),
@rtn1 varchar(50) out,
@rtn2 varchar(50) out
as
begin
print 'Starting spTestPrintStmt...';
print 'Vars: ' + @var1 + ',' + @var2 + ',' + @var3;
select @rtn1 = @var1, @rtn2 = @var2 + @var3;
print 'Returned: ' + @rtn1 + ',' + @rtn2;
return 0;
end;
go
我使用以下PHP页面来测试上面的存储过程:
Stored Proc Param Test$result = 0;
$var1 = 'abc';
$var2 = 'def';
$var3 = 'ghi';
$rtn1 = '';
$rtn2 = '';
$connectionInfo = array("Database"=>'database', "UID"=>'username', "PWD"=>'password');
$conn = sqlsrv_connect("dbserver", $connectionInfo);
if( $conn === false ) {
echo "Couldn't connect to SQL Server on dbserver.
";
die( print_r( sqlsrv_errors(), true));
} else {
echo "Connected!";
}
echo '
';
$tsql = "{ ? = call spTestPrintStmt(?,?,?,?,?) }";
$params = array(
array($result, SQLSRV_PARAM_INOUT),
array($var1, SQLSRV_PARAM_IN),
array($var2, SQLSRV_PARAM_IN),
array($var3, SQLSRV_PARAM_IN),
array($rtn1, SQLSRV_PARAM_INOUT),
array($rtn2, SQLSRV_PARAM_INOUT)
);
$stmt = sqlsrv_query($conn, $tsql, $params);
if ($stmt === false) {
echo "Error in executing stored proc.";
die( print_r( sqlsrv_errors(), true));
echo "
";
}
sqlsrv_next_result($stmt);
echo "Result: " . $result . "
";
echo "Rtn1: " . $rtn1 . "
";
echo "Rtn2: " . $rtn2 . "
";
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
当我运行上面的内容时,我得到以下结果:
Connected!
Error in executing stored proc.Array ( [0] => Array ( [0] => 01000 [SQLSTATE] => 01000 [1] => 0 [code] => 0 [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Starting spTestPrintStmt... [message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Starting spTestPrintStmt... ) )
有没有办法解决?我们在T-SQL代码中广泛使用print语句来帮助调试。