【发布时间】:2018-01-03 17:17:49
【问题描述】:
我们正在将一些 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页面来测试上面的存储过程:
<html>
<head>
<title>Stored Proc Param Test</title>
</head>
<body>
<p>
<?php
$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.<br />";
die( print_r( sqlsrv_errors(), true));
} else {
echo "Connected!";
}
echo '<br/>';
$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 "<br/>";
}
sqlsrv_next_result($stmt);
echo "Result: " . $result . "<br/>";
echo "Rtn1: " . $rtn1 . "<br/>";
echo "Rtn2: " . $rtn2 . "<br/>";
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
</p>
</body>
</html>
当我运行上面的,我得到以下结果:
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 语句来帮助调试。
【问题讨论】:
-
我了解使用 PRINT 来帮助调试,但为什么它们没有在生产代码中注释掉?
标签: php sql-server