While循环与表更新

时间:2020-04-05 17:22:24

标签: sql-server string loops while-loop

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

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

1 个答案:

答案 0 :(得分:1)

您犯的唯一错误是没有为循环的每次迭代更新变量class CustomView: UIView { @IBOutlet var contentView: UIView! @IBOutlet weak var stackView: UIStackView! override init(frame: CGRect) { super.init(frame: frame) initialize() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) initialize() } func initialize() { Bundle.main.loadNibNamed("CustomView", owner: self, options: nil) addSubview(contentView) contentView.frame = self.bounds contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth] } ... some other things that I've left out that aren't important ... } 。以下内容解决了这个问题,并且为了清楚起见,整理了变量的用法,即使用变量而不是临时表,并且仅对单个变量而不是两个变量进行处理:

@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