【问题标题】: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 中处理值数组的更一般性讨论,请参阅 thisthis

标签: arrays sql-server loops


【解决方案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, ',')
    

    【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 2021-01-29
      • 1970-01-01
      • 2022-11-29
      • 1970-01-01
      相关资源
      最近更新 更多