0

質問があります。複数のテーブルに挿入する必要があります。ここでの問題は、他の 2 つのテーブルの最初のテーブルの ID が必要なことです。だから私は3つのテーブルを持っています。最初に挿入し、次にSCOPE_IDENTITYを取得IDし、他の 2 に入力する必要があります。問題は、SCOPE_IDENTITY最後IDの挿入の を取得することです。したがって、3 番目の挿入IDでは、1 番目ではなく 2 番目を取得します。

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 を取得する際に問題がありますか? 私は本当にそれを機能させる方法がわかりません。

私が得た助けを前もって感謝します;)

編集:変数 @EmpID は、tsql_ID が実行された後に宣言されなくなり、次の挿入が新しいステートメントにあることがわかりました。どういうわけか、変数はここで失われます。

ステートメントを正しく組み合わせる方法はありますか?

4

2 に答える 2

0

これを変える

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

これに

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

(それを int としてキャストする必要はありませんが、データ型を明示的に使用すると役立ちます)

于 2014-05-20T10:19:05.413 に答える