2016-10-11 7 views
0

Я полный новичок в SQL-функциях, это мой первый вопрос после многого по этому вопросу.sql server shrink a> 5 varchar string для установки varchar (4)

Я пытаюсь выбрать список значений, которые являются varchar (8), и преобразовать их в varchar (4) Для этого мне нужно будет усечь значение в третьей позиции и добавить символ, который варьируется от 1 до 9, а затем возобновляется с 1

например PATOL, PATOLB, PATOLC должен стать pat1, pat2, PAT3 и так далее

Я нашел в Интернете кусок кода, который я пытаюсь адаптировать , но у меня проблемы с приращением счетчика

, пожалуйста, будьте терпеливы за ошибки, а за неиспользованные форма, это моя первая попытка кодирования, так как мой Commodore 64 BASIC в 80-х

вот моя функция:

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
go 

ALTER function [dbo].[f_To4char] (@value varchar(10)) 
RETURNS varchar(4) 
AS 
BEGIN 
    DECLARE @seq varchar(9) 
    DECLARE @digit char (1) 
    DECLARE @3car varchar(3) 
    DECLARE @result varchar(4) 
    DECLARE @count int 

SET @seq = '123456789' 
SET @count = 1 

    IF len(@value)<=4 
    return @value 
else 

BEGIN 
WHILE (@count <=9) 

     BEGIN 
     SET @digit = SUBSTRING(@seq,@count,1) 
     SET @count = @count+1 
     SET @3car = substring (@value,1,3) 
     SET @result = @[email protected] 
     END 
END 
RETURN @result 

END 

Это правильно возвращаемые значения нетронутыми, если они длинные < = 4 символов, и правильно обрезает больше значения до 3 символов, но всегда добавляет один и тот же символ вместо циклического перехода от 1 до 9.

Можете ли вы помочь мне заставить его работать? Спасибо

EDIT (2016-10-12) Спасибо за ответ и комментарии Между тем я уже пробовал следующее, но ничего не делать: она всегда возвращает 1, прилагаемого полукокс

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 

go 

ALTER FUNCTION [dbo].[f_To4char](@value VARCHAR(10)) 
RETURNS varchar(4) 
AS 
BEGIN 
     DECLARE @digit char(1); 
     DECLARE @count smallint; 
     DECLARE @3car VARCHAR(3); 
     DECLARE @shrunk varchar(4); 
     DECLARE @result VARCHAR(4); 

set @count=1 ; 

     IF LEN(@value) <= 4 
      RETURN @value; 
     ELSE 



     BEGIN 

      begin 
      if @count=1 
      set @digit = '1'; 
      SET @3car = SUBSTRING(@value, 1, 3); 
      SET @shrunk = @3car + @digit; 
      set @[email protected]+1  
      RETURN @shrunk;  
      end 

      begin 
      if @count=2 
      set @digit = '2'; 
      SET @3car = SUBSTRING(@value, 1, 3); 
      SET @shrunk = @3car + @digit; 
      set @[email protected]+1  
      RETURN @shrunk;  
      end 

      begin 
      if @count=3 
      set @digit = '3'; 
      SET @3car = SUBSTRING(@value, 1, 3); 
      SET @shrunk = @3car + @digit; 
      set @[email protected]+1  
      RETURN @shrunk;  
      end 

      begin 
      if @count=4 
      set @digit = '4'; 
      SET @3car = SUBSTRING(@value, 1, 3); 
      SET @shrunk = @3car + @digit; 
      set @[email protected]+1  
      RETURN @shrunk;  
      end   

      begin 
      if @count=5 
      set @digit = '5'; 
      SET @3car = SUBSTRING(@value, 1, 3); 
      SET @shrunk = @3car + @digit; 
      set @[email protected]+1  
      RETURN @shrunk;  
      end 

      begin 
      if @count=6 
      set @digit = '6'; 
      SET @3car = SUBSTRING(@value, 1, 3); 
      SET @shrunk = @3car + @digit; 
      set @[email protected]+1  
      RETURN @shrunk;  
      end 

      begin 
      if @count=6 
      set @digit = '6'; 
      SET @3car = SUBSTRING(@value, 1, 3); 
      SET @shrunk = @3car + @digit; 
      set @[email protected]+1  
      RETURN @shrunk;  
      end 

      begin 
      if @count=7 
      set @digit = '7'; 
      SET @3car = SUBSTRING(@value, 1, 3); 
      SET @shrunk = @3car + @digit; 
      set @[email protected]+1  
      RETURN @shrunk;  
      end 

      begin 
      if @count=8 
      set @digit = '8'; 
      SET @3car = SUBSTRING(@value, 1, 3); 
      SET @shrunk = @3car + @digit; 
      set @[email protected]+1  
      RETURN @shrunk;  
      end 

      begin 
      if @count=9 
      set @digit = '9'; 
      SET @3car = SUBSTRING(@value, 1, 3); 
      SET @shrunk = @3car + @digit; 
      set @[email protected]+1  
      RETURN @shrunk;  
      end   




if @count=10 set @count=1 



     END; 
     return @shrunk 
END; 
+0

Каким образом он должен проходить цикл 1 - 9? Он не знает, что было добавлено к предыдущим строкам? –

ответ

0

Это то, что вы хотите сделать:

SET ANSI_NULLS ON; 

SET QUOTED_IDENTIFIER ON; 
GO 

ALTER FUNCTION [dbo].[f_To4char](@value VARCHAR(10)) 
RETURNS VARCHAR(4) 
AS 
    BEGIN 
     DECLARE @seq VARCHAR(9); 
     DECLARE @digit CHAR(1); 
     DECLARE @3car VARCHAR(3); 
     DECLARE @result VARCHAR(4); 
     IF LEN(@value) <= 4 
      RETURN @value; 
     ELSE 
      BEGIN 
       SET @digit = LEN(@value) - 4; --<--this may have to be 3 rather than 4 depending on what you want the suffix to be. 
       SET @3car = SUBSTRING(@value, 1, 3); 
       SET @result = @3car + @digit; 
      END; 
     RETURN @result; 
    END; 

Избегайте использования петли в любом месте вы можете. Они вызывают снижение производительности.

+0

Это не кажется правильным, входы PATOLA и PATOLB вернут тот же результат? –

+0

что он должен вернуть? Длина символов для PATOLA и PATOLB одинакова, поэтому они должны возвращать то же самое из того, что я понимаю, но я, возможно, неправильно понял. –

+0

По его вопросу PATOLA должен вернуть PAT2, и PATOLB должен вернуть PAT3. Я не думаю, что это возможно без хранимой процедуры или принятия каких-либо серьезных предположений относительно входов. –