Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在事务SQL中设置所有权_Sql_Sql Server - Fatal编程技术网

在事务SQL中设置所有权

在事务SQL中设置所有权,sql,sql-server,Sql,Sql Server,这已经困扰了我好几天了,我有一个自动递增的表,我想要的是递增值的值将插入到同一行中。问题是,当并发用户访问查询时,它不会复制正确的值 以下是我的表格: CREATE TABLE tblTransactions ( dctransno INT IDENTITY PRIMARY KEY, vcDescription VARCHAR, dcTransNoCopy INT NULL, user VARCHAR )

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

以下是我的表格:

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.

请提供帮助,提前感谢。

您需要使用范围\标识()而不是@标识


进一步信息

为什么不使用输出表

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 

这是来自

我假设dcTransNoCopy是CloneTransNo,dcTransNo只是TransNo?示例数据和提供的代码使用不同的名称。另外,如果使用scope_identity(),这能解决问题吗?我怀疑会是的,对不起,dcTransNoCopy是CloneTransNo,dcTransNo只是TransNo。你给我们看的代码
SET dcTransNoCopy=@identity,其中dcTransNo=@identity
永远不会产生
4,3
。两列的值总是一样的。嗨,马丁,这件事实际上发生在我这边,已经让我发疯好几天了。好吧,不是你给我们看的代码在做这件事。这永远不会导致
dcTransNoCopy
具有与
dcTransNo
不同的值。您还没有向我们展示更多内容。您好,bhs,我已经尝试使用scope_identity,这就是为什么我切换到@@identity,但我以前没有在查询中添加begin tran。我看看会发生什么。顺便说一句,感谢您的快速回复。没问题-scope_identity()正是为了这个目的,尽管它应该可以工作:-)嗨,Mathese,谢谢这些,我对输出一无所知。这是否取代了scope_identity()以有效地捕获事务中的标识?您好,是的,您不必再使用scope_标识了。Microsoft分类查找标识的方法如下:@@identity在同一pid中不安全,scope\u identifie在不同pid中不安全,输出最佳实践。看看这篇文章:)我现在用输出替换查询。将监测结果。谢谢!