Как зациклить каждую запись в CTE и прочитать значения столбца - PullRequest
0 голосов
/ 29 марта 2019

Я должен зациклить данные в CTE и извлечь каждую запись и обработать на основе значения одного столбца.

CREATE PROCEDURE [dbo].[sp_saveVmssMapping]
    (@serverTypes INT = 0,
     @vmsses INT = 0,
     @regions INT = 0,
     @countryList VARCHAR)
AS 
    WITH countryTbl AS
    (
        SELECT value 
        FROM STRING_SPLIT(@countryList, ',')
    )
    DECLARE @cnt INT = 0;
    DECLARE @cnt_total INT;
    SET @cnt_total = SELECT COUNT(*) FROM countryTbl;

    WHILE @cnt < cnt_total
    BEGIN
        IF NOT EXISTS (SELECT * FROM VmssCountryMapping 
                       WHERE VmssId = @vmsses 
                         AND Country_code = @userName 
                         AND ServerTypeId = @serverTypes)
        BEGIN
            INSERT INTO VmssCountryMapping (VmssId, Country_code, ServerTypeId) 
            VALUES (@vmsses, @userName, @serverTypes)
        END
        SET @cnt = @cnt + 1;
    END

Здесь я создал CTE, в который я добавляю записи, разделенные запятыми.Теперь я буду зацикливать каждую запись и обрабатывать вставку, если она соответствует запросу.

1 Ответ

1 голос
/ 29 марта 2019

Нет необходимости зацикливать результат, вы можете просто вставить все сразу.

CREATE PROCEDURE [dbo].[sp_saveVmssMapping]
(
    @serverTypes INT = 0,
    @vmsses INT = 0,
    @regions INT = 0,
    @countryList VARCHAR(AlwaysAssignALength)
)
AS 
with countryTbl as 
(
 SELECT value FROM STRING_SPLIT(@countryList, ',')
)
INSERT INTO VmssCountryMapping (VmssId, Country_code, ServerTypeId) 
SELECT @vmsses, value, @serverTypes 
FROM countryTbl c
WHERE  NOT EXISTS (SELECT * 
                    FROM VmssCountryMapping m
                    WHERE m.VmssId = @vmsses 
                    AND m.Country_code = c.value 
                    AND m.ServerTypeId = @serverTypes);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...