我在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
所以这个循环可以正确地完成这项工作...我在做什么错了?
答案 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