[英]How to insert a record to table with row number in Transact-SQL?
我正在使用Microsoft SQL Server 2012 Management Studio。
我现在正在使用存储过程来存储从XML到表的SOAP Web服务响应。 除了为每个记录分配唯一且持久的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可以使用Identity
属性为您生成自动递增编号。
您不能使用ALTER TABLE
语句将现有列更改为标识列(或将标识列更改为“常规”列),但是可以删除现有id
列并将其重新创建为identity
列:
ALTER TABLE [dbo].[sometable]
DROP COLUMN Id;
ALTER TABLE [dbo].[sometable]
ADD Id int IDENTITY(1,1);
请注意,标识列不应具有业务意义,因为SQL Server仅保证自动生成它们。 不保证它们没有间隙, 也不保证它们是唯一的。
SQL Server不会重用已经生成的值,即使生成它们的insert
语句失败,但是有一个命令可以重置identity
列,因此下次将行插入数据库时, identity
将从新种子。 这意味着标识列可能具有重复的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.