在sql server中递归更新语句

问题描述:

我有一个ID为varchar(10)的表。可能的值是一样在sql server中递归更新语句

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

任何机会,你可以编辑你的问题,并以更清晰的方式布局你的当前值和期望的输出。以这种格式阅读问题是不可能的。 – Tanner 2014-11-05 22:13:02

+0

看看这个问题,看看如何提高你的问题的可读性:http://*.com/questions/12801247/sql-query-to-get-desired-output – Tanner 2014-11-05 22:16:17

快速基于集合的(非循环)的方法将使用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

你的问题不是太清楚,但如果我理解正确的话,听起来好像要每秒数后插入一个小数点。一种方法是使用循环:

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; 

您需要小心,通过在数据中添加额外字符,不会溢出列的大小。