2014-11-05 167 views
0

我有一個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://stackoverflow.com/questions/12801247/sql-query-to-get-desired-output – Tanner 2014-11-05 22:16:17

回答

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

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; 

您需要小心,通過在數據中添加額外字符,不會溢出列的大小。