这里一种可能的方法是参数化语句并使用sqlsrv_query()。正如documentation 中提到的,sqlsrv_query 函数非常适合一次性查询,除非有特殊情况,否则应该是执行查询的默认选择,sqlsrv_query 函数同时执行这两种语句准备和语句执行,可用于执行参数化查询。
存储过程具有varchar 参数(我几乎可以肯定,您使用的是西里尔排序规则),因此您可能需要使用适当的编码(连接选项中的"CharacterSet" => "UTF-8" 或"CharacterSet" => SQLSRV_ENC_CHAR)和/或参数值的字符集转换(例如iconv())。阅读UTF-8 all the way through 是一个很好的起点。
如果存储过程返回数据,你可以尝试使用sqlsrv_fetch_array()来检索返回的数据。您还可以使用SET NOCOUNT ON 来防止 SQL Server 将受影响的行数作为结果集的一部分传递。
以下示例基于您的代码,是您问题的可能解决方案:
<?php
// Connection
$server = "SERVERNAME";
$database = "DBNAME";
$cinfo = array(
"CharacterSet" => "UTF-8",
"Database" => $database
);
$con = sqlsrv_connect($server, $cinfo);
if ($con === false) {
echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
exit;
}
// Statement
$sql = "
SET NOCOUNT ON;
DECLARE @dt datetime;
SET @dt = GETDATE();
EXEC oik..SrezLTGES
@Cat = ?,
@Ids = ?,
@Time = @dt,
@TimeIsSummer = 1,
@ShowSystemTime = 1
";
$params = array("Ë", "140539,140540,140589,150395,180395,180396,180445");
$stmt = sqlsrv_query($con, $sql, $params);
if ($stmt === false) {
echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
exit;
}
// Data
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
echo print_r($row, true);
}
// End
sqlsrv_free_stmt($stmt);
sqlsrv_close($con);
?>