Laravel5.1 调用 mssql 存储过程问题

老是报错:
SQLSTATE[42000]: [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]必须声明标量变量

代码:

    $dbh = DB::connection()->getPdo();

    $procName = "GetSerialNo";
    $stmt = $dbh->prepare("EXEC $procName @s_Code=:code, @sOutValue=:out");
    $nReturnValue = "BORROWCODE";
    $strReturnValue = "";

    $stmt->bindParam(':code', $nReturnValue, \PDO::PARAM_STR);
    $stmt->bindParam(':out', $strReturnValue, \PDO::PARAM_INT | \PDO::PARAM_INPUT_OUTPUT, 50);
    $r = $stmt->execute();

    dd($strReturnValue);

存储过程已经成功执行,现在问题是怎么可以正确的取到存储过程输出的参数?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 3

没用过 SQL Server 的路过。。。

9年前 评论

解决了

用PDO调用就这样调用是没问题

    //调用存储过程 start
    $dbh = DB::connection()->getPdo();
    $stmt = $dbh->prepare("EXEC GetSerialNo ?,?");
    $code = "BORROWCODE";
    $value = "";        //输出参数:编号
    $stmt->bindParam(1, $code, \PDO::PARAM_STR);
    $stmt->bindParam(2, $value, \PDO::PARAM_STR | \PDO::PARAM_INPUT_OUTPUT, 50);
    $stmt->execute();
    var_dump($value);
    //end

重点来了

在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。

不然如果存储过程中有更新之类的语句时会直接返回影响的行数,会出问题。

9年前 评论
baitongda

ThinPHP能调用存储过程吗?

9年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!