Как вставить записи в таблицу в цикле? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть таблица с полем 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

В верхнем коде я пытаюсь вставить значения в цикл после нахождения идентификатора последней записи и объявления счетчика

Ответы [ 3 ]

1 голос
/ 12 апреля 2019

Использование циклов не является хорошим решением. Вы можете попытаться определить временную таблицу и вставить новые данные одним оператором. Значения для 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
1 голос
/ 12 апреля 2019

Вы можете использовать табличную переменную для хранения кодов. Затем выполните INSERT ... SELECT из этой переменной.Чтобы получить идентификаторы, вы можете использовать row_number() ваш максимальный идентификатор из другой таблицы.

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

1 голос
/ 12 апреля 2019

Вместо массива вы можете использовать строку через запятую. Нравится следующее:

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, ',')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...