我有个问题。我必须插入多个表。这里的问题是,我需要另外 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。不知何故,变量在这里丢失了。
知道如何正确组合语句吗?