2016-10-11 5 views
0

私はSQL関数の総数です。これはこのトピックについて多くのことを検索した後の私の最初の質問です。sql server varchar(4)に合うように> 5のvarchar文字列を縮小します。

私はvarchar(8)である値のリストを選択して、それらをvarchar(4)に変換しようとしています これを行うには、3番目の位置で値を切り捨て、 9から1は、その後、例えばPATOL、PATOLB 1

から再起動し、PATOLCは、PAT3 PAT2 PAT1なるはずので

に私は、ウェブ上で私が適応しようとしているコードの一部を見つけましたしかし、私はカウンターの増分で問題を抱えています

間違いや非エレガントそれは正しく、彼らが< = 4文字の長さであれば値がそのまま返す

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 

、そして正しく長く切り捨て:フォームは、これはここで私の関数の80の

の私のコモドール64 BASIC以来、コーディングの私の最初の試みであります値は3文字になりますが、1から9までのサイクリングではなく、常に同じ文字が付加されます。

できますか? はあなたに答えを

EDIT(2016年10月12日) 感謝をありがとう。一方、私は次のことを試してみた コメントが、何も行わないために:それは常に追加charとして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を返します。私は、ストアドプロシージャなしで、または入力に関するいくつかの大きな前提をすることは可能ではないと思います。 –

関連する問題