如何在Transact-SQL中向具有行号的表插入记录?

如何在Transact-SQL中向具有行号的表插入记录?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在使用Microsoft SQL Server 2012 Management Studio 我现在使用存储过程将SOAP web服务响应从XML存储到表中。我已经完成了大部分工作,除了为每个记录分配一个唯一的持久id的部分 我想出了这样的办法: INSERT INTO [dbo].[sometable] SELECT T.r.value('someKey[1]','char(8)') AS some_key, T1.r1.value('lang[1

我正在使用Microsoft SQL Server 2012 Management Studio

我现在使用存储过程将SOAP web服务响应从XML存储到表中。我已经完成了大部分工作,除了为每个记录分配一个唯一的持久id的部分

我想出了这样的办法:

INSERT INTO [dbo].[sometable]
    SELECT 
        T.r.value('someKey[1]','char(8)') AS some_key,
        T1.r1.value('lang[1]','char(10)') AS lang,
        T1.r1.value('description[1]','char(30)') AS description,
        T1.r1.value('phone[1]','char(10)') AS phone,
        GETDATE() AS insert_time,
        NULL AS id 
    FROM 
        @xDoc.nodes('//*:SomeNode') AS T(r)
    CROSS APPLY 
        T.r.nodes('SomeList/SomeItem') AS T1(r1)    

DECLARE @id INT 

SET @id = 0 

UPDATE [dbo].[sometable] 
SET @id = id = @id + 1 
上面的代码一眼就能给出完美的结果。但是,id不是持久的,因为SQL更新将重写整个表的id

如何解决这个问题


如果有任何信息不清楚或丢失,请告诉我。

SQL Server可以使用属性为您生成自动递增数字

不能使用ALTER TABLE语句将现有列更改为标识列或将标识列更改为常规列,但可以删除现有id列并将其重新创建为标识列:

请注意,标识列不应具有业务意义,因为SQL Server只保证自动生成它们。它们不能保证没有差距,也不能保证是唯一的


SQL Server不会重用已生成的值,即使生成这些值的insert语句失败,但会有一个命令重置标识列,以便下次将行插入数据库时,标识将从新种子开始。这意味着标识列可能有重复的值。

为什么不简单地使用自动增量id?您能更改表吗?我是后端开发新手,您能给我看一下自动增量id的引用吗?FDavidov我可以完全控制表。类似这样的内容:alter table[yourTable]删除列ID ALTER TABLE[yourTable]添加ID INT IDENTITY1,1?
ALTER TABLE [dbo].[sometable]
    DROP COLUMN Id;

ALTER TABLE [dbo].[sometable]
    ADD Id int IDENTITY(1,1);