【问题标题】:While Loop with Table Update带表更新的 While 循环
【发布时间】:2020-07-17 16:03:07
【问题描述】:

我在 SQL Server 中遇到了 While 循环问题。

我想要做的是拆分类似的东西:

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

进入有 2 列的表,其中一列是 '@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 行相同的表测试:NAME / JOHN

所以这个循环几乎正确地完成了这项工作......我做错了什么?

【问题讨论】:

    标签: sql-server string loops while-loop


    【解决方案1】:

    您犯的唯一错误是没有为循环的每次迭代更新变量@y。下面解决了这个问题,并且为了清楚起见整理了变量的使用,即使用一个变量而不是一个临时表,并且只使用一个变量而不是两个变量来处理正在处理的数据:

    -- 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
    

    【讨论】:

    • 你确定SELECT LEN(y) FROM test2
    • 哦,如果test2 包含超过 1 行,(SELECT LEN(y) FROM test2) > 0 会抛出错误
    • 读者不会看他所有的问题,这里的 test2 是一个表格。对我来说,最好根据提供的信息来回答它,或者将其用作变量并修复代码。
    猜你喜欢
    • 1970-01-01
    • 2018-08-17
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 2021-12-28
    • 1970-01-01
    • 2019-05-06
    相关资源
    最近更新 更多