如何在循环中将记录插入表中?
Posted
技术标签:
【中文标题】如何在循环中将记录插入表中?【英文标题】:How to insert records into table in loop? 【发布时间】:2019-04-12 11:29:29 【问题描述】:我有一个带有非自动增量 ID 字段的表。我需要创建一个 varchar 数组,然后将数组中的数据插入表中。
问题是我不知道如何声明这样的数组。而且我不知道如何通过循环中的索引来处理值。
declare @newCodesList - ???
declare @counter int = 0
declare @lastID int = (select MAX(Id) from OrganizationCode)
while @counter < LEN(@newCodesList)
begin
@lastID = @lastID + 1
insert into OrganizationCodeCopy values(@lastID, @newCodesList[@counter])
@counter = @counter + 1
end
在上面的代码中,我尝试在找到最后一条记录 ID 并声明计数器后在循环中插入值
【问题讨论】:
在上面的代码中,我认为不需要数组。你为什么需要它 ?如果您解释了您要实现的目标,这将有所帮助,也许有更好的方法来做到这一点 为什么要使用循环?使用基于集合的方法。您实际上想在这里实现什么目标? 我需要一个脚本,它更新表格,用新值填充它。我从来没有尝试插入很多新值,所以循环是第一件事,在我脑海中浮现)主要思想只有新数据是手动输入的。我的意思是上次我用手插入了 20 个值。 @GuidoG 看起来像是STRING_SPLIT
的工作和/或numbers table 上的连接(或@newCodesList
上的直接连接,如果它实际上是一个表值参数)。如果可以避免的话,你不想在 SQL 中编写循环;找到一种方法来改用表格来改写你的问题。
有关如何在 SQL 中处理值数组的更一般性讨论,请参阅 this 和 this。
【参考方案1】:
您可以使用表变量来存储代码。然后从该变量中执行INSERT ... SELECT
。要获取 ID,您可以使用 row_number()
另一个表中的最大 ID。
DECLARE @codes TABLE
(code nvarchar(4));
INSERT INTO @codes
(code)
VALUES ('A01B'),
('B03C'),
('X97K');
INSERT INTO organizationcodecopy
(id,
code)
SELECT (SELECT coalesce(max(id), 0)
FROM organizationcode) + row_number() OVER (ORDER BY code) id,
code
FROM @codes;
db<>fiddle
【讨论】:
【参考方案2】:您可以使用逗号分隔的字符串来代替数组。如下:
DECLARE @newCodesList VARCHAR(MAX) = 'value1,value2'
DECLARE @lastID int = (SELECT MAX(Id) FROM OrganizationCode)
INSERT INTO OrganizationCodeCopy
(
Id,
Code
)
SELECT
@lastID + ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS Id
Element AS Code
FROM
asi_SplitString(@newCodesList, ',')
【讨论】:
asi_SplitString
来自哪里?
@ThomasSchremser 对不起,我忘了提到该功能并非在 SQL Server 的所有迭代中都可用。但是,您可以在此处找到函数脚本:docs.imis.com/15.2/Schema/Programmability/Functions/…【参考方案3】:
使用循环不是一个好的解决方案。您可以尝试定义一个临时表并使用一条语句插入新数据。 Id
的值是使用 ROW_NUMBER()
函数生成的:
-- New data
CREATE TABLE #NewCodes (
Code varchar(50)
)
INSERT INTO #NewCodes
(Code)
VALUES
('Code1'),
('Code2'),
('Code3'),
('Code4'),
('Code5'),
('Code6')
-- Last ID
DECLARE @LastID int
SELECT @LastId = (SELECT ISNULL(MAX(Id), 0) FROM OrganizationCode)
-- Statement
INSERT INTO OrganizationCode
(Id, Code)
SELECT
@LastId + ROW_NUMBER() OVER (ORDER BY Code) AS Id,
[Code]
FROM #NewCodes
【讨论】:
以上是关于如何在循环中将记录插入表中?的主要内容,如果未能解决你的问题,请参考以下文章