php -如何执行sqlsrv存储过程

qyzbxkaa  于 2023-01-29  发布在  PHP
关注(0)|答案(1)|浏览(235)

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

$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中执行这个查询,有什么想法吗?

5m1hhzi4

5m1hhzi41#

这里可能的方法是参数化语句并使用sqlsrv_query()。如documentation中所述,*sqlsrv_query函数非常适合于一次性查询,除非出现特殊情况,否则应作为执行查询的默认选择 *,*sqlsrv_query函数同时进行语句准备和语句执行,可用于执行参数化查询 *。
存储过程有varchar参数(我几乎可以肯定,您使用的是西里尔语排序规则),因此您可能需要使用适当的编码(连接选项中的"CharacterSet" => "UTF-8""CharacterSet" => SQLSRV_ENC_CHAR)和/或对参数值进行字符集转换(例如iconv())。
如果存储过程返回数据,则可以尝试使用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);
?>

相关问题