0

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

现在我尝试通过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 Result 是否存在问题?我真的不知道如何使它工作。

提前感谢我得到的任何帮助;)

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

知道如何正确组合语句吗?

4

2 回答 2

0

改变这个

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

对此

 $tsql_ID = "SELECT SCOPE_IDENTITY() AS EmpID;";
于 2014-05-20T10:22:52.283 回答
0

改变这个

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

对此

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

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

于 2014-05-20T10:19:05.413 回答