Пока L oop с обновлением таблицы - PullRequest
0 голосов
/ 05 апреля 2020

У меня проблема с While L oop на SQL Сервере.

Я хочу разделить что-то вроде:

'@Name=John;@Surname=Kowalsky;@DATA=data;'

В таблицу с двумя столбцами, где один будет '@Name', а второй 'John'

После каждого разделения я написал обновление, чтобы удалить строку разделения и начать с новой, но это не работает.

CREATE TABLE test2 (x varchar(max), y varchar(max))
INSERT INTO test2 VALUES (1, '@Name=John;@Surname=Kowalsky;@DATA=data;')
CREATE TABLE test (x varchar(max), y varchar(max))

DECLARE @y varchar(max) = (SELECT y FROM test2)
WHILE (SELECT LEN(y) FROM test2) > 0

BEGIN
    INSERT INTO test (x,y)
    VALUES ((SUBSTRING(@y, CHARINDEX('@', @y)+1, CHARINDEX('=',@y) -CHARINDEX('@',@y)-1)),
            (SUBSTRING(@y, CHARINDEX('=', @y)+1, CHARINDEX(';',@y) -CHARINDEX('=',@y)-1)))

    UPDATE test2
    SET  y = REPLACE(y, SUBSTRING(y, 1, CHARINDEX(';', y)), '')
    FROM test2
END

В ответ я получаю тест таблицы с 3 одинаковыми строками: ИМЯ / ДЖОН

Итак, этот l oop выполняет эту работу ПОЧТИ правильно ... Что я делаю неправильно

1 Ответ

1 голос
/ 05 апреля 2020

Единственной ошибкой, которую вы допустили, было не обновление переменной @y для каждой итерации l oop. Следующее решает это и для ясности приводит в порядок использование переменной, т.е. использует переменную вместо временной таблицы и использует только одну переменную вместо двух для обрабатываемых данных:

-- Input data
DECLARE @Test2 VARCHAR(MAX) = '@Name=John;@Surname=Kowalsky;@DATA=data;';

-- Output table
DECLARE @Test1 TABLE (x VARCHAR(MAX), y VARCHAR(MAX))

-- While we still have data to process
WHILE LEN(@Test2) > 0 BEGIN
    -- Extract one pair from the input string and put into the output table
    INSERT INTO @Test1 (x,y)
    VALUES ((SUBSTRING(@Test2, CHARINDEX('@', @Test2)+1, CHARINDEX('=',@Test2) -CHARINDEX('@',@Test2)-1)),
            (SUBSTRING(@Test2, CHARINDEX('=', @Test2)+1, CHARINDEX(';',@Test2) -CHARINDEX('=',@Test2)-1)))

    -- Update the variable @Test2 each iteration, removing the processed data
    set @Test2 = REPLACE(@Test2, SUBSTRING(@Test2, 1, CHARINDEX(';', @Test2)), '');
END

SELECT * FROM @Test1

Возвращает:

x       | y
--------| --------
Name    | John
Surname | Kowalsky
DATA    | data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...