0

我在SQL Server 2008版本中进行了一些初始开发,并且因为它是测试脚本,所以我在事务中使用脚本查询来实际上不影响数据库表。为什么在SQL Server中回滚转换增加种子值

但似乎记录没有输入数据库,但每次执行脚本时种子值都会增加。

T-SQL脚本:

Begin Tran 

DECLARE @hdoc int 
DECLARE @doc VARCHAR(MAX) 
SET @doc = 
'<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <places> 
     <Row> 
    <Field_0>53.570438</Field_0> 
    <Field_1>-113.390992</Field_1> 
    <Field_2>Address details 1</Field_2> 
    <Field_3>Lab 1</Field_3> 
</Row> 
<Row> 
    <Field_0>53.542062</Field_0> 
    <Field_1>-113.528646</Field_1> 
    <Field_2>Address details 2</Field_2> 
    <Field_3>Lab 2</Field_3> 
</Row> 
    </places> 
</root>' 

EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc 

INSERT INTO dbo.Laboratories 
(Name, Latitude, Longitude, [Image], ContentDetails, CreatedDate, CreatedBy, UpdatedDate, UpdatedBy) 
SELECT ROW_NUMBER() OVER (ORDER BY Name) 
, cast(Latitude as decimal(11,8)), cast(Longitude as decimal(11,8)), null, Content, GETDATE(), 1, null, null 
FROM OPENXML (@hdoc, '/root/places/Row', 2) 
     WITH (
     Name nvarchar(100) 'Field_3' 
      ,Latitude varchar(20) 'Field_0' 
      ,Longitude varchar(18) 'Field_1' 
      ,Content nvarchar(100) 'Field_2' 
      ) 

EXEC sp_xml_removedocument @hdoc 

select * from dbo.Laboratories 

rollback tran 

我有以下脚本来识别当前种子值

SELECT 
    IDENT_SEED(TABLE_NAME) AS Seed, 
    IDENT_INCR(TABLE_NAME) AS Increment, 
    IDENT_CURRENT(TABLE_NAME) AS Current_Identity, 
    TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 'TableHasIdentity') = 1 
AND TABLE_TYPE = 'BASE TABLE' 

这是从here


引用的基本问题是

  1. 即使在转换回滚时,它为什么会增加标识值?
  2. 如何解决这个问题,从下次不会影响事务未提交时的种子值?

PS:我可以重新认证这个身份,我知道这件事。

+0

可能的重复[为什么我的IDENTITY列值存在差距?](http://stackoverflow.com/questions/14642013/why-are-there-gaps-in-my-identity-column-values) – Pondlife

+0

不,它看起来不一样,我有交易的地方,我认为事务回滚时什么都不应该受到影响.. –

+0

然后你的问题可能是[这一个]的副本(http://stackoverflow.com/questions/) 282451/sql-identity-autonumber-is-increment-even-with-a-transaction-rollback) – Pondlife

回答

2
  1. 一旦标识值被分配,它会保持分配是否滚动bakc,提交失败,不管。这通常适用于MySQL AUTOINCREMENT和SEQUENCE功能
  2. 您不能。这是由设计

它应该没有区别它身份有差距或没有差距。一个IDENTITY只是一个没有任何外在含义的任意替代值:它只是在那里补充次优的自然键。

+0

对于(2): - 他可以在catch部分使用种子修复(手动修复)此问题。 – Maximus

+0

@Sivakumar:如果在RESEED发生之前另一次交易进入并获取下一个号码会怎么样? – gbn

+0

直到当前事务结束,才能访问该表。在回滚不会改变种子值的情况下,我们可以在回滚事务之前重新调整种子。如我错了请纠正我。 – Maximus

相关问题