我正在使用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。
如何解决这个问题?
如果有任何信息不清楚或丢失,请告诉我。
答案 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
将从新种子开始。这意味着标识列可能具有重复值。