在COMMIT之前在MS SQL中获取插入的主键


Get inserted primary key in MS SQL before COMMIT

在PHP中,我试图将多行插入两个单独的表中。因为这些都需要成功,我从开始

mssql_query("BEGIN TRAN");

然后我在主表中插入:

$insert_Proposal = 'INSERT INTO PROPOSALS( ';
$insert_Proposal .= 'ApprovedByDev, ';
$insert_Proposal .= 'EstFundingEndFiscalYear, ';
$insert_Proposal .= 'EstFundingStartDate, ';
$insert_Proposal .= 'ProjectDesc, ';
$insert_Proposal .= 'ProjectType, ';
$insert_Proposal .= 'ProposalComments ';
$insert_Proposal .= ') VALUES ( ';
$insert_Proposal .= sqlSafeVars($_POST['ApprovedByDev'], "varchar") .', '; 
$insert_Proposal .= sqlSafeVars($_POST['EstFundingEndFiscalYear'], "bigint") .', '; 
$insert_Proposal .= sqlSafeVars($_POST['EstFundingStartDate'], "varchar") .', '; 
$insert_Proposal .= sqlSafeVars($_POST['ProjectDesc'], "varchar") .', '; 
$insert_Proposal .= sqlSafeVars($_POST['ProjectType'], "bigint") .', '; 
$insert_Proposal .= sqlSafeVars($_POST['ProposalComments'], "varchar") .' '; 
$insert_Proposal .= ')';

我需要的是获得将由它创建的自动编号的ProposalID,这样我就可以在发出COMMIT之前使用它将记录插入到另一个表中

我发现了使用以下内容的建议:

output inserted.pk

INSERT INTO Persons (FirstName) VALUES ('Joe');
SELECT ID AS LastID FROM Persons WHERE ID = @@Identity;

但是,如果您不提交初始事务,这些似乎就不起作用。提前感谢您的帮助。

使用OUTPUT子句或使用SCOPE_IDENTITY的两种解决方案,即使启动了事务,也应该可以正常工作。但我看不出它们中的任何一个在你发布的代码中被实际使用。OUTPUT子句必须附加到您编写的INSERT中,类似于:

$insert_Proposal = 'INSERT INTO PROPOSALS( ';
$insert_Proposal .= 'ApprovedByDev, ';
...
$insert_Proposal .= ') ';
$insert_Proposal .= 'OUTPUT INSERTED.id '
$insert_Proposal .= ' VALUES ( ';
$insert_Proposal .= sqlSafeVars($_POST['ApprovedByDev'], "varchar") .', '; 
...
$insert_Proposal .= ')';

并且您需要执行$insert_Proposal作为返回结果的语句。

您可能想要使用SCOPE_IDENTITY,因为它返回当前会话和范围内最后插入的标识。作用域可以是批处理、存储过程、函数或触发器。