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

时间:2018-05-08 07:55:56

标签: sql sql-server tsql

我正在使用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。

如何解决这个问题?

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

1 个答案:

答案 0 :(得分:7)

SQL Server可以使用Identity属性为您生成自动增量编号。

您无法使用ALTER TABLE语句将现有列更改为标识列(或标识列为"常规"列),但您可以删除现有列{1}}列,并将其重新创建为id列:

identity

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

SQL Server不会重用已经生成的值,即使生成它们的ALTER TABLE [dbo].[sometable] DROP COLUMN Id; ALTER TABLE [dbo].[sometable] ADD Id int IDENTITY(1,1); 语句失败,但是有一个命令要重置insert列,以便下次有一行时插入数据库后,identity将从新种子开始。这意味着标识列可能具有重复值。