我在存储过程中有一个语句
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
看起来像是一个桌子的可怕名称,我希望在您的真实代码中,您有一个有意义的名称:(