繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM