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

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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3

没用过 SQL Server 的路过。。。

8年前 评论

解决了

用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 。

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

8年前 评论
baitongda

ThinPHP能调用存储过程吗?

8年前 评论

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