在sql server中递归更新语句

时间:2014-11-05 22:04:28

标签: sql-server recursion

我有一个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 如何递归应用更新语句。

由于

2 个答案:

答案 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;

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