在事务SQL中设置所有权

时间:2014-02-18 12:59:09

标签: sql sql-server

这让我困扰了好几天,我有一个自动增加的表,我想要的是增量值的值将插入同一行。问题是当并发用户访问查询时,它不会复制正确的值。

以下是我的表格:

CREATE TABLE tblTransactions
  (
     dctransno     INT IDENTITY PRIMARY KEY,
     vcDescription VARCHAR,
     dcTransNoCopy INT NULL,
     user          VARCHAR        
  )

和我的查询:

BEGIN TRAN

INSERT INTO tblTransactions
            (dctransno,
             user)
VALUES      (@vcDescription,
             @user); 

SET @identity = @@IDENTITY -- get the identity

UPDATE tblTransactions
SET    dcTransNoCopy = @identity
WHERE  dcTransNo = @identity
       AND user = @user; -- insert

COMMIT TRAN 

我想要实现的是我可以像以下示例一样进行分组交易。问题是我的上述查询没有获得所有权。假设userA和userB同时使用系统:

       dcTransNo      Description     dcTransNoCopy      User
          1          Transaction1      1                userA
          2          Transaction2      1                userA
          3          Transaction3      1                userA
          4          Transaction1      3                userB       ---> not correct, ClonetransNo value for userB should be 4 not 3.

请提前帮助,谢谢。

2 个答案:

答案 0 :(得分:1)

您需要使用SCOPE_IDENTITY()而不是@@ identity

更多信息here

答案 1 :(得分:0)

为什么不使用输出表?

DECLARE @InsertedRows TABLE (ProductID INT, ProductNumber NVARCHAR(25) ) 
INSERT Product ([Name], ProductNumber, ListPrice) 
OUTPUT inserted.ProductID, inserted.ProductNumber 
INTO @InsertedRows 
SELECT [Name], ProductNumber, ListPrice 
FROM ProductsToInsert AS I 
WHERE NOT EXISTS (SELECT 1 FROM Product WHERE ProductNumber = I.ProductNumber) 

UPDATE ProductsToInsert 
SET InsertedIdentityValue = T.ProductID 
FROM ProductsToInsert I 
JOIN @InsertedRows T ON T.ProductNumber = I.ProductNumber 

SELECT RowID, ProductNumber, InsertedIdentityValue 
FROM ProductsToInsert 
WHERE InsertedIdentityValue IS NOT NULL 

来自http://www.sqlteam.com/article/using-the-output-clause-to-capture-identity-values-on-multi-row-inserts