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)。
他们是怎么做到的呢
第一步,在反向模式下选择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在这里
归档时间: |
|
查看次数: |
380 次 |
最近记录: |