【问题标题】:php - how execute a sqlsrv stored procedurephp - 如何执行 sqlsrv 存储过程
【发布时间】:2021-03-08 13:31:07
【问题描述】:

我在我的 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 中执行这个查询。有什么想法吗?

【问题讨论】:

    标签: php sql-server database sqlsrv


    【解决方案1】:

    这里一种可能的方法是参数化语句并使用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);
    ?>
    

    【讨论】:

    • 谢谢。但是我如何从 $stmt 获取结果数据???
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2015-07-11
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多