唯一使用函数在插入语句中使用每个记录的唯一ID



我在存储过程中有一个语句

INSERT into table(ID, name, age)
    SELECT fnGetLowestFreeID(), name, age 
    FROM @tempdata

功能fnGetLowestFreeID()获得表table的最低自由ID。我想在表中的每个记录中插入唯一的ID。我尝试了迭代和交易。但是它们不适合场景。

我不能使用身份列。我对使用0-4之间使用ID并使用该功能分配最低自由ID的限制。如果返回的ID大于4,则该功能正在返回错误。假设表中已经有1和2。该函数将返回0,我必须将此ID分配给新记录,3到下一个记录,依此类推,依此类推。

尝试此

CREATE TABLE dbo.Tmp_City(Id int NOT NULL IDENTITY(1, 1), 
Name varchar(50) , Country varchar(50), )

ALTER TABLE dbo.Tmp_City
MODIFY COLUMN Id int NOT NULL IDENTITY(1, 1)

创建一个序列并分配序列。nextVal为ID在插入语句

您可以使用诸如row_number之类的等级函数并执行这样的事情。

 INSERT into table(ID, name, age)
 SELECT row_number() over (order by id) + fnGetLowestFreeID(), name, age 
 FROM @tempdata

这是3个方案 -

1(显示您使用的功能

2(使用功能并使其独一无二没有意义仍然 - 您可以使用等级 -

INSERT into table(ID, name, age)
 SELECT row_number() over (order by id) + fnGetLowestFreeID(), name, age 
 FROM @tempdata

3(否则,摆脱功能并使用max(id( 1,因为您不想使用Identitiy列

您可以使用数字表来加入查询执行您的插入。您可以用Google Google搜索更多信息,但是从本质上讲,您可以使用某些整数类型的单列" nums"创建一个表(例如使用名称"数字"(,然后添加一些行,从0或1,并根据需要。例如,您可以以此表内容结尾:

nums
----
 0
 1
 2
 3
 4
 5
 6

然后,您可以使用这样的表修改插入物,而不再需要该功能:

INSERT into table(ID, name, age)
SELECT t2.nums, t.name, t.age 
FROM (
    SELECT name, age, row_number() over (order by name) as seq
    FROM @tempdata
) t
INNER JOIN (
    SELECT n.nums, row_number() over (order by n.nums) as seq
    FROM Numbers n
    WHERE n.nums < 5 AND NOT EXISTS (
        SELECT * FROM table WHERE table.ID = n.nums
    )
) t2 ON t.seq = t2.seq

现在,此查询忽略了您的要求之一,当没有可用插槽时,这将引起错误,但这很容易修复。您以前可以进行查询并测试table中的记录计数以及@tempdata中的记录总和高于5。如果是这样,则启动错误,因为您知道@tempdata中的记录没有足够的免费插槽。

旁注: table看起来像是一个桌子的可怕名称,我希望在您的真实代码中,您有一个有意义的名称:(

最新更新