向字符串添加行尾标记

Rah*_*awe 3 sql-server-2008 sql-server

我们有一个场景,我们需要在从 SQL Server 获取数据时修改输入字符串。

“TEST RATE CODE DESC TEST RATE CODE DESCTST TEST”并且C是“DESCTST”中的第47个字符,然后在单词的开头推入定界符。像“\DESCTST”

例如:

当前 => 测试速率代码 DESC 测试速率代码 DESCTST 测试\

必需 => 测试速率代码 DESC 测试速率代码 DESCTST \TEST

我们已经创建了一个 SQL 函数来实现这一点,除了示例中提到的向后操作外,一切正常。

这是我的 SQL 函数:

ALTER  FUNCTION [dbo].[DescFormatter_New]
(
    @InputString nvarchar(max), 
    @MaxLength int=0,
    @CharPerLine int=0,
    @NoOfLines int=0
)
RETURNS nvarchar(max)
AS
BEGIN   
    DECLARE @ResultText nvarchar(max)
    DECLARE @I INT
    DECLARE @COUNT INT

    IF(LEN(@InputString)<@CharPerLine)
        BEGIN
            SET @ResultText=@InputString
        END
    ELSE
        BEGIN
            set @InputString=LEFT(@InputString,@MaxLength)                              
            SET @I = LEN(@InputString)/@CharPerLine
            
            if((@I*@CharPerLine)<LEN(@InputString))
                BEGIN
                    SET @I=@I+1 
                END         

            SET @COUNT =1
            SET @ResultText= LEFT((@InputString),@CharPerLine)
            if(@I>@NoOfLines)
                Begin
                    set @I=@NoOfLines
                End
            WHILE(@I>1 AND @I<=@NoOfLines)
                BEGIN
                    SET @ResultText=@ResultText+'\'+SUBSTRING(@InputString,(@COUNT*@CharPerLine)+1,@CharPerLine)
                    SET @COUNT=@COUNT+1
                    SET @I=@I-1
                END
        END
    RETURN @ResultText
END
Run Code Online (Sandbox Code Playgroud)

我们像这样调用这个函数:

[dbo].[DescFormatter_New](LText,94,47,2) AS [Short Description]
Run Code Online (Sandbox Code Playgroud)

请注意,对于包含超过 100 或 200 个字符的字符串,我们将需要多个行分隔符。

以下是几个例子:

1) 输入字符串= 豪华宽敞 房间内 1 张特大床 惠而浦电脑 吧台冰箱 迷你吧台 保险箱 WIFI 温暖的装饰

预期输出= 豪华宽敞 1 张特大床 NS 客房 \Whirlpool Computer Wet Bar 冰箱 Mini \Bar Desk Safe WIFI 温暖的装饰

2)NPUT字符串=宽敞1号床非吸烟设有带电缆的WiFi咖啡迷你FRIG微波吹风机铁板测试测试平板电视

预期输出= 宽敞的 1 张大床,无烟房,配备纯平\屏幕电视和有线 wifi 咖啡机迷你 \frig 微波炉吹风机熨斗板测试\测试

在上面预期的输出字符串中,第一个分隔符出现在 47 个字符之后,即在Whirl\pool之间(显示为 \Whirlpool),然后循环将在 Whirlpool 中的 Whirl 之后再次从计数 1 开始,所以第二个分隔符应该像这里Des\ k(显示为 \Desk)。

McN*_*ets 7

他们是怎么做到的呢

第一步,在反向模式下选择N个字符的第一个子串。

REVERSE(SUBSTRING(@Text, @InitPos, @CharPosition))<
Run Code Online (Sandbox Code Playgroud)

第二步,在反转字符串中找到第一个空格位置,即所选单词的开头:

SELECT @pos = CHARINDEX(' ', @Str);
Run Code Online (Sandbox Code Playgroud)

然后再次反转它,获取字符串的左侧部分并添加分隔符“/”:

LEFT(REVERSE(@Str), @CharPosition - @Pos + 1) + '/';
Run Code Online (Sandbox Code Playgroud)

最后一步通过计算下一个初始位置,根据所选单词的开头:

@InitPos + @CharPosition - @Pos + 1;
Run Code Online (Sandbox Code Playgroud)

整个功能:

CREATE FUNCTION [DescFormatter] (@Text nvarchar(max), @CharPosition int)
RETURNS nvarchar(max)
AS
BEGIN
    DECLARE @Pos int = 0;
    DECLARE @Str nvarchar(max) = '';
    DECLARE @Out nvarchar(max) = '';
    DECLARE @InitPos int = 1;

    WHILE @InitPos + @CharPosition < LEN(@Text)
    BEGIN
        SELECT @Str = REVERSE(SUBSTRING(@Text, @InitPos, @CharPosition));
        SELECT @Pos = CHARINDEX(' ', @Str);
        SELECT @Out = @Out + LEFT(REVERSE(@Str), @CharPosition - @Pos + 1) + '/';
        SET @InitPos = @InitPos + @CharPosition - @Pos + 1;
    END

    SELECT @Out = @Out + SUBSTRING(@Text, @InitPos, LEN(@Text) - @InitPos + 1);

    RETURN @Out;    
END
GO
Run Code Online (Sandbox Code Playgroud)

如何使用它:

SELECT dbo.[DescFormatter]('Deluxe and spacious 1 King Bed NS in room Whirlpool Computer Wet Bar Refrigerator Mini Bar Desk Safe WIFI Warm Decor', 47);
Run Code Online (Sandbox Code Playgroud)

这是结果:

Deluxe and spacious 1 King Bed NS in room /Whirlpool Computer Wet Bar Refrigerator Mini /Bar Desk Safe WIFI Warm Decor
Run Code Online (Sandbox Code Playgroud)

dbfiddle在这里