2014-11-05 2 views
0

ID가 varchar (10) 인 테이블이 있습니다. 가능한 값은 2 (6)에 대한 우리의 새로운 요구 사항의 .i.e 길이에SQL 서버에서 재귀 적으로 업데이트되는 문

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') 

등처럼 우리가이 개 숫자가 01이 동일하게 유지 을 즉 후 소수점을 가지고 있다고 말한다; 011은 011.1이되고; 0110 내지 01.10; 01110 ~ 01.11.0; 011111 ~ 01.11.11 수동으로 업데이트 문을 작성했지만 700 개의 고유 ID가 있습니다. 어떻게 업데이트 문을 재귀 적으로 적용 할 수 있습니까?

감사

+0

언제든지 질문을 편집하고 현재 값과 원하는 출력을보다 명확하게 레이아웃 할 수 있습니다. 이 형식으로 질문을 읽는 것은 불가능합니다. – Tanner

+0

이 질문을보고 질문의 가독성을 향상시키는 방법을 확인하십시오. http://stackoverflow.com/questions/12801247/sql-query-to-get-desired-output – Tanner

답변

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; 

당신은 당신의 데이터로 추가 문자를 추가하여, 당신은 칼럼의 크기를 오버 플로우하지 않도록주의해야합니다.

관련 문제