如何在循环中将记录插入表中?

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

【讨论】:

以上是关于如何在循环中将记录插入表中?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 中将游标循环查询的结果插入到临时表中

在循环中将字符串插入到表中

sql 如何在MySql中将数据插入表中

如何在 postgresql 函数中将数组插入表中?

oracle中,如何在一张表插入数据,使得插入数据的某些字段为其他表中的数据

如何在 Laravel 中将数据从 1 个视图插入到 2 个表中