繁体   English   中英

PHP中具有SCOPE_IDENTITY()的多个SQL事务

[英]Multiple SQL Transactions with SCOPE_IDENTITY() in php

我有个问题。 我必须插入多个表。 这里的问题是,我需要其他2个表中的第一个表的ID。 所以我有3张桌子。 首先插入,然后使用SCOPE_IDENTITY获得ID ,然后在其他2上输入ID 。问题是, SCOPE_IDENTITY给了我最后一个插入的ID 因此,在第3次插入时,我得到的是第二个ID而不是第一个。

现在,我尝试通过选择获取ID ,并将其保存到变量中。 但这不起作用。

我在php上使用交易。 这是我的代码

sqlsrv_begin_transaction( $conn );

    // Set up and execute the first query. 
    $tsql1 = "INSERT INTO CmContainer
                    (CmContainer.Serial
                    ,CmContainer.Valid
                    ,CmContainer.OnBlacklist
                    ,CmContainer.BlacklistingRequested)
                VALUES
                    ('".$userdata['cmContainer']."'
                    ,'1'
                    ,'0'
                    ,'0');"; 


    $cursorType = array('Scrollable' => SQLSRV_CURSOR_KEYSET);
    $stmt1 = sqlsrv_query( $conn, $tsql1, null, $cursorType);

    $tsql_ID = "SET @EmpID=SCOPE_IDENTITY();";
    $cursorType = array('Scrollable' => SQLSRV_CURSOR_KEYSET);
    $stmt_ID = sqlsrv_query( $conn, $tsql_ID, null, $cursorType);

    $tsql2 = "INSERT INTO CmContainerBelonging
                    (CmContainerBelonging.CmContainerID
                    ,CmContainerBelonging.CompanyID)
                VALUES
                    (@EmpID
                    ,'".$_SESSION['userData']['companyID']."')";

    $cursorType = array('Scrollable' => SQLSRV_CURSOR_KEYSET);
    $stmt2 = sqlsrv_query( $conn, $tsql2, null, $cursorType);

    $tsql3 = "INSERT INTO CmContainerStatistic
                    (CmContainerStatistic.CmContainerID
                    ,CmContainerStatistic.CreationTime)
                VALUES
                    (@EmpID
                    ,GETDATE())";

    $cursorType = array('Scrollable' => SQLSRV_CURSOR_KEYSET);
    $stmt3 = sqlsrv_query( $conn, $tsql3, null, $cursorType);

    if( $stmt1 && $stmt2 && $stmt3) 
    { 
        sqlsrv_commit( $conn ); 
        $lang['successCmRegistration'];
    }else { 
        sqlsrv_rollback( $conn ); 
        error_log('Query error: '.print_r( sqlsrv_errors(), true));
        $error .= 'Error on Update!';
    }

执行此操作时,我莫名其妙地收到一个错误。 是不可能用php做到这一点,或者在事务中完成SELECT SELECT时是否存在问题? 我真的不知道如何使它工作。

在此先感谢您获得的任何帮助;)

编辑:我发现,在执行tsql_ID之后,不再声明变量@EmpID,并且下一个Insert在新的Statement中。 不知何故,变量在这里丢失了。

任何想法,我如何可以正确地组合语句?

改变这个

 $tsql_ID = "SET @EmpID=SCOPE_IDENTITY();";

对此

 $tsql_ID = "SET @EmpID=(SELECT CAST(SCOPE_IDENTITY() AS INT);";

(好吧,您不必将其强制转换为int,但有助于显式使用数据类型)

改变这个

 $tsql_ID = "SET @EmpID=SCOPE_IDENTITY();";

对此

 $tsql_ID = "SELECT SCOPE_IDENTITY() AS EmpID;";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM