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

时间:2019-04-12 11:29:30

标签: arrays sql-server loops

我有一个带有非自动增量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并声明计数器之后在循环中插入值

3 个答案:

答案 0 :(得分:1)

可以使用逗号分隔的字符串代替数组。如下所示:

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, ',')

答案 1 :(得分:1)

使用循环不是一个好的解决方案。您可以尝试定义一个临时表并使用一条语句插入新数据。 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

答案 2 :(得分: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