SQL Server 缩小一个 >5 个 varchar 字符串以适合一个 varchar(4)



我对SQL函数完全不熟悉,这是我在搜索了很多关于这个主题的内容后的第一个问题。

我正在尝试选择一个varchar(8)的值列表,并将它们转换为varchar (4)要做到这一点,我需要在第三个位置截断值,并附加一个从1到9不等的字符,然后从1

重新开始。

e。g PATOL, PATOLB, PATOLC应该变成PAT1, PAT2, PAT3等等

我在网上找到了一段代码,我试图适应,但我有麻烦与计数器的增量

请耐心等待错误,对于不优雅的形式,这是我自80年代我的Commodore 64 BASIC以来第一次尝试编码

下面是我的函数:

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 = @3car+@digit
        END
END
RETURN @result
END

如果长度为<=4个字符,则正确返回未修改的值,并正确将较长的值截断为3个字符,但始终追加相同的字符,而不是从1循环到9。

你能帮我让它工作吗?谢谢你

编辑(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 @count=@count+1    
             RETURN @shrunk;    
            end
            begin
             if @count=2 
             set @digit = '2';
             SET @3car = SUBSTRING(@value, 1, 3);
             SET @shrunk = @3car + @digit;
             set @count=@count+1    
             RETURN @shrunk;    
            end
            begin
             if @count=3 
             set @digit = '3';
             SET @3car = SUBSTRING(@value, 1, 3);
             SET @shrunk = @3car + @digit;
             set @count=@count+1    
             RETURN @shrunk;    
            end
            begin
             if @count=4 
             set @digit = '4';
             SET @3car = SUBSTRING(@value, 1, 3);
             SET @shrunk = @3car + @digit;
             set @count=@count+1    
             RETURN @shrunk;    
            end         
            begin
             if @count=5 
             set @digit = '5';
             SET @3car = SUBSTRING(@value, 1, 3);
             SET @shrunk = @3car + @digit;
             set @count=@count+1    
             RETURN @shrunk;    
            end
            begin
             if @count=6 
             set @digit = '6';
             SET @3car = SUBSTRING(@value, 1, 3);
             SET @shrunk = @3car + @digit;
             set @count=@count+1    
             RETURN @shrunk;    
            end
            begin
             if @count=6 
             set @digit = '6';
             SET @3car = SUBSTRING(@value, 1, 3);
             SET @shrunk = @3car + @digit;
             set @count=@count+1    
             RETURN @shrunk;    
            end
            begin
             if @count=7 
             set @digit = '7';
             SET @3car = SUBSTRING(@value, 1, 3);
             SET @shrunk = @3car + @digit;
             set @count=@count+1    
             RETURN @shrunk;    
            end
            begin
             if @count=8 
             set @digit = '8';
             SET @3car = SUBSTRING(@value, 1, 3);
             SET @shrunk = @3car + @digit;
             set @count=@count+1    
             RETURN @shrunk;    
            end
            begin
             if @count=9 
             set @digit = '9';
             SET @3car = SUBSTRING(@value, 1, 3);
             SET @shrunk = @3car + @digit;
             set @count=@count+1    
             RETURN @shrunk;    
            end         


if @count=10 set @count=1

        END;
      return @shrunk
 END;

这就是你要做的:

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;

尽量避免使用循环。

最新更新