[英]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.