2012-01-18 32 views
0

在PHP中,我试图将多行插入到两个单独的表中。因为这些都需要成功,我开始有:在COMMIT之前在MS SQL中获取插入的主键

$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 .= ')'; 

我需要的是让投标套件autonumbered,这将是:

mssql_query("BEGIN TRAN"); 

然后,我通过插入到主表运行这个创造,所以我可以用它来记录插入到另一个表,我之前发出COMMIT

我发现建议使用这样的:

output inserted.pk 

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

但这些似乎并没有,如果你不提交初始交易工作。预先感谢您的帮助。

+0

我认为问题在于使用自动编号;你必须在表格中使用一个身份。请参阅http://stackoverflow.com/questions/661998/oracle-sequence-but-then-in-ms-sql-server – Luis

+0

我只是这个网页上的程序员,没有DBA特权,所以我可以提出建议,但我必须忍受他们提供的结构。这就是说,当我说自动编号时,我的意思是它被定义为身份增量为1的身份 – AlexC

回答

2

使用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为返回结果的声明。

+0

我最初用SELECT IDENT_CURRENT发布了一个答案,因为我认为SCOPE_IDENTITY在提交之后才生成值...但是我研究过后发现它在插入开始时生成新的ID,而不管它是否回滚。所以,删除我的答案并投票给你。 http://stackoverflow.com/questions/5666536/sql-server-scope-identity-thread-safety – RThomas

+0

感谢Remus,我把OUTPUT放在了错误的地方。它确实保留了主键,即使我没有提交查询。 – AlexC

2

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

相关问题