MS SQL中的分词

MS SQL中的分词,sql,sql-server,tsql,Sql,Sql Server,Tsql,我创建了一种在MS SQL中获取字符串并在空格处将其拆分的方法,以避免分词。如果每行包含17个或更多字符,则会将一个字符串拆分为3个单独的字符串,用于新行 DECLARE @Prod_Desc varchar(50) = '12345 BAG 15 LB NR SML BTS CHICKEN MEAL AND RICE' DECLARE @Prod_Desc_Line2 varchar(50); DECLARE @Prod_Desc_Line3 varchar(50); -- Generate

我创建了一种在MS SQL中获取字符串并在空格处将其拆分的方法,以避免分词。如果每行包含17个或更多字符,则会将一个字符串拆分为3个单独的字符串,用于新行

DECLARE @Prod_Desc varchar(50) = '12345 BAG 15 LB NR SML BTS CHICKEN MEAL AND RICE'
DECLARE @Prod_Desc_Line2 varchar(50);
DECLARE @Prod_Desc_Line3 varchar(50);

-- Generate second line and center
IF len(@Prod_Desc) >= 17
BEGIN
SELECT @Prod_Desc_Line2 = SUBSTRING(@Prod_Desc, 18 - CHARINDEX(' ', REVERSE(SUBSTRING(@Prod_Desc, 1, 17)), 1), len(@Prod_Desc) + CHARINDEX(' ', REVERSE(SUBSTRING(@Prod_Desc, 1, 17)), 1) - 17);
SELECT @Prod_Desc = SUBSTRING(@Prod_Desc, 1, 17 - CHARINDEX(' ', REVERSE(SUBSTRING(@Prod_Desc, 1, 17)), 1));
END;

-- Generate third line and center
IF len(@Prod_Desc_Line2) >= 17
BEGIN
SELECT @Prod_Desc_Line3 = SUBSTRING(@Prod_Desc_Line2, 18 - CHARINDEX(' ', REVERSE(SUBSTRING(@Prod_Desc_Line2, 1, 17)), 1), len(@Prod_Desc_Line2) + CHARINDEX(' ', REVERSE(SUBSTRING(@Prod_Desc_Line2, 1, 17)), 1) - 17);
SELECT @Prod_Desc_Line2 = SUBSTRING(@Prod_Desc_Line2, 1, 17 - CHARINDEX(' ', REVERSE(SUBSTRING(@Prod_Desc_Line2, 1, 17)), 1));
END;

PRINT(@Prod_Desc);
PRINT(@Prod_Desc_Line2);
PRINT(@Prod_Desc_Line3);
输出:

12345 BAG 15 LB
NR SML BTS
CHICKEN MEAL AND RICE
我想怎么做就怎么做,但我觉得它看起来很邋遢。我想知道是否有更好的方法来进行字符串除法,或者是否存在这样做的函数

为了澄清,如果字符串大于17个字符,它会找到达到该限制之前的最后一个空格,将其从原始字符串中截断,并将其添加到下一行的下一个字符串中。

一个选项

示例

DECLARE @S varchar(100) = '12345 BAG 15 LB NR SML BTS CHICKEN MEAL AND RICE'
Declare @MaxLen int = 17

Select Line1 
      ,Line2 = ltrim(stuff(Line2,1,len(Line1),''))
      ,Line3 = ltrim(stuff(Line3,1,len(Line2),''))
 From (
        Select Line1 = Left(@S,@MaxLen-CharIndex(' ',Reverse(Left(@S,@MaxLen))))
              ,Line2 = Left(@S,@MaxLen*2-CharIndex(' ',Reverse(Left(@S,@MaxLen*2))))
              ,Line3 = @S
      ) A
返回

Line1              Line2        Line3
12345 BAG 15 LB    NR SML BTS   CHICKEN MEAL AND RICE
ID  Line1               Line2                  Line3
1   12345 BAG 15 LB     NR SML BTS CHICKEN     MEAL AND RICE
2   Some Random Text    should be split        into 3 strings
编辑一套方法

一种选择

示例

DECLARE @S varchar(100) = '12345 BAG 15 LB NR SML BTS CHICKEN MEAL AND RICE'
Declare @MaxLen int = 17

Select Line1 
      ,Line2 = ltrim(stuff(Line2,1,len(Line1),''))
      ,Line3 = ltrim(stuff(Line3,1,len(Line2),''))
 From (
        Select Line1 = Left(@S,@MaxLen-CharIndex(' ',Reverse(Left(@S,@MaxLen))))
              ,Line2 = Left(@S,@MaxLen*2-CharIndex(' ',Reverse(Left(@S,@MaxLen*2))))
              ,Line3 = @S
      ) A
返回

Line1              Line2        Line3
12345 BAG 15 LB    NR SML BTS   CHICKEN MEAL AND RICE
ID  Line1               Line2                  Line3
1   12345 BAG 15 LB     NR SML BTS CHICKEN     MEAL AND RICE
2   Some Random Text    should be split        into 3 strings
编辑一套方法


这最好发布在codereview上。还有很多其他的方法可以做到这一点——这个问题是StackOverflow的扩展方法当最后一行是7500个字符时会发生什么?你想要超长的?另外,您是否试图将此应用于一组数据?如果是这样的话,那么我猜你有一个基于当前逻辑的循环。这是真的吗?完整的sql过程为打印机生成一个.DPL,因此它只从一个标签的一个项目中获取信息。给定字符串的最大长度为50个字符,平均每行16.67个字符,所以这不会是一个问题。这最好发布在codereview上。还有很多其他的方法可以做到这一点——这个问题是StackOverflow的扩展方法当最后一行是7500个字符时会发生什么?你想要超长的?另外,您是否试图将此应用于一组数据?如果是这样的话,那么我猜你有一个基于当前逻辑的循环。这是真的吗?完整的sql过程为打印机生成一个.DPL,因此它只从一个标签的一个项目中获取信息。给定字符串的最大长度为50个字符,平均每行16.67个字符,因此这不会是问题。1来自我,因为它可以应用于集合范围,我认为运算逻辑不会。1来自我,因为它可以应用于集合范围,我认为运算逻辑不会。