我有一个ID varchar(10)的表。可能的值类似于
create table temp(id varchar(10))
insert into id('01')
insert into id('011')
insert into id('0110')
insert into id('01110')
insert into id('011111')
insert into id('02')
insert into id('020')
insert into id('0222')
等等.i.e长度为2到6.我们的新要求是说我们必须在2个数字之后有小数,即 01保持不变; 011变为011.1; 0110至01.10; 01110至01.11.0; 011111至01.11.11 我手动编写了更新语句,但有700个这样的不同ID 如何递归应用更新语句。
由于
答案 0 :(得分:1)
快速基于集合(非循环)的方法将使用这样的Case
语句:
Update dbo.Temp
Set id =
Case
When Len(Id) <= 2 Then Id
When Len(Id) Between 3 and 4 Then Left(Id, 2)
+ '.' + Substring(Id, 3, 2)
When Len(Id) Between 5 and 6 Then Left(Id, 2)
+ '.' + Substring(Id, 3, 2)
+ '.' + Substring(Id, 6, 2)
End;
这是SQL Fiddle。
答案 1 :(得分:0)
你的问题不太清楚,但如果我理解正确,听起来你想在每隔一个数字后插入一个小数点。一种方法是循环:
CREATE TABLE #t(id VARCHAR(100));
INSERT #t (id) VALUES ('01'),('011'),('0110'),('01110'),('011111'),('02'),('020'),('0222'),('010203040');
DECLARE @iteration INT = 0, @rowsAffected INT = 1;
WHILE @rowsAffected > 0
BEGIN
UPDATE #t
SET id = STUFF(id, 3 + (@iteration * 3), 0, '.')
WHERE LEN(id) > 2 + (3 * @iteration) ;
SELECT @rowsAffected = @@ROWCOUNT
, @iteration += 1;
END;
您需要注意的是,通过在数据中添加额外的字符,您不会超出列的大小。