【问题标题】:Calling stored procedures in Laravel 5.5 using SQL Server with output使用带有输出的 SQL Server 在 Laravel 5.5 中调用存储过程
【发布时间】:2018-03-09 04:24:20
【问题描述】:

我有以下存储过程:

declare @CodigoRet int

exec Generator 'LancaContaContabil', @Codigo = @CodigoRet output

Select @CodigoRet
  • OBS:LancaContaContabil 是我的桌子,而 Codigo 是该桌子的 PK

我正在尝试在 Laravel 5.5 中调用此过程,但它给了我错误:“查询的活动结果不包含字段”:

$results = DB::select(DB::raw('DECLARE @CodigoRet INT; execute Generator 
\'LancaContaContabil\', @Codigo = @CodigoRet OUTPUT;'));
echo $results;
die;

使用不带 dbraw 的变体时同样的错误:

$results = DB::select('DECLARE @CodigoRet INT; EXEC Generator         
\'LancaContaContabil\', @Codigo = @CodigoRet OUTPUT;');
echo $results;
die;

也试过with语句,但返回总是1:

$results = DB::statement('DECLARE @CodigoRet INT; EXEC Generator 
\'LancaContaContabil\', @Codigo = @CodigoRet OUTPUT;');
echo $results;
die;

编辑:我创建了名为“testeproc”的过程,现在我已经尝试过了,但出现了与上面相同的错误:

$results = DB::select('EXECUTE testeproc');
echo $results;
die;

我做错了什么?

【问题讨论】:

    标签: php sql-server laravel stored-procedures laravel-5


    【解决方案1】:

    这是一个示例存储过程:

    CREATE PROCEDURE ReturnIdExample
        (
                 @paramOne int
                ,@paramTwo nvarchar(255)
        )
        AS
    
        SET NOCOUNT ON; --IMPORTANT!
    
        BEGIN
    
        -- Grab the id that was just created
        DECLARE @ObjectID int;
    
        INSERT INTO [Table]
        (
                 [ColumnNameA]
                ,[ColumnNameB]
        ) VALUES (
                 @paramOne
                ,@paramTwo
        )
    
        SET @ObjectID = SCOPE_IDENTITY();
    
        -- Select the id to return it back to laravel
        SELECT@ObjectID AS ObjectID;
    
    END
    

    在 Laravel 模型/控制器中调用这个存储过程:

    $submit = DB::select("EXEC ReturnIdExample ?,?", array( $paramOne ,$paramTwo ) );
    

    在 Laravel 模型中访问返回变量:

    return $submit[0]->ObjectId;
    

    【讨论】:

      【解决方案2】:

      我刚刚整理好了。我将在这里发布可以帮助其他有同样问题的人的解决方案。

      $dbh = DB::connection()->getPdo();
      $sth = $dbh->prepare("SET NOCOUNT ON; EXEC ProcLancaContaContabil");
      $sth->execute();
      $codigo = $sth->fetchAll(PDO::FETCH_COLUMN, 0);
      

      诀窍是在调用过程之前使用“SET NOCOUNT ON”。 我找到了这个here

      【讨论】:

        【解决方案3】:

        试试这个:

        无参数:

        $results = DB::select('EXEC your_stored_procedure');
        

        机智参数

        $results = DB::select('exec your_stored_procedure("parameter1", "parameter2",..)');
        

        $results = DB::select('exec your_stored_procedure(?,?,..)',array($parameter1,$parameter2));
        

        【讨论】:

        • 感谢 Alessandro 的回复,但我已经尝试过了,错误是相同的“查询的活动结果不包含字段”。现在我刚刚创建了一个简单的测试程序,只有一个选择并且工作正常。但是输出之一,仍然失败。
        • @Alessandro Minoccheri 也许你可以帮助我。看看这个:stackoverflow.com/questions/51838922/…
        猜你喜欢
        • 1970-01-01
        • 2012-11-24
        • 1970-01-01
        • 2010-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-02
        • 1970-01-01
        相关资源
        最近更新 更多