php - 如何执行一个sqlsrv存储过程

php - how execute a sqlsrv stored procedure

我在 PHP 脚本中使用 SQLSRV 成功连接到 SQL 服务器:

$name = 'SERVERNAME';
$db  = 'DBNAME';
$par = array("Database"=>$db);

$conn = sqlsrv_connect($name, $par);

我还有以下 T-SQL 脚本:

Declare @dt datetime;
SET @dt = GETDATE();
EXEC oik..SrezLTGES @Cat = 'Ë', @Ids = '140539,140540,140589,150395,180395,180396,180445',@Time = @dt

程序参数为:

我不知道如何在 PHP 中执行此查询。有什么想法吗?

此处一种可能的方法是将语句参数化并使用 sqlsrv_query()。正如documentation中提到的,sqlsrv_query函数非常适合一次性查询,应该是执行查询的默认选择,除非特殊情况适用sqlsrv_query函数既做语句准备又做语句执行,可用于执行参数化查询.

存储过程有 varchar 个参数(我几乎可以肯定,您使用的是西里尔字母排序规则),因此您可能需要使用适当的编码("CharacterSet" => "UTF-8""CharacterSet" => SQLSRV_ENC_CHAR 在连接选项中) and/or 参数值的字符集转换(以 iconv() 为例)。阅读 UTF-8 all the way through 是一个很好的起点。

如果存储过程有returns数据,可以尝试用sqlsrv_fetch_array()取回返回的数据。您还可以使用 SET NOCOUNT ON 来防止 SQL 服务器将受影响行的计数作为结果集的一部分传递。

以下示例基于您的代码,是您问题的可能解决方案:

<?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);
?>