如何在Transact-SQL中向具有行号的表插入记录?
我正在使用Microsoft SQL Server 2012 Management Studio 我现在使用存储过程将SOAP web服务响应从XML存储到表中。我已经完成了大部分工作,除了为每个记录分配一个唯一的持久id的部分 我想出了这样的办法:如何在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
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);