2017-08-07 25 views
0

我已经创建了一种方法来在MS SQL中取出一个字符串并将其分解到一个空格处以避免分词。如果每行的长度等于或大于17个字符,则会将字符串拆分为3个单独的字符串作为新行。在MS SQL中拆分单词

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个字符,它会在限制命中之前找到最后一个空格,将其从原始字符串中截断,并将其添加到下一行的下一个字符串中。

+1

这将能更好地贴在代码审查。 https://codereview.stackexchange.com/ –

+0

还有很多其他的方法来做到这一点 - 这个问题是广泛的方式stackoverflow – Hogan

+0

当最后一行是7500个字符会发生什么?你想要它超长?另外,你是否试图将其应用于一组数据?如果是这样,那么我猜你有一个基于你当前逻辑的循环。这是真的? – scsimon

回答

2

一种选择

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 

编辑集理论

Declare @YourTable table (ID int,SomeCol varchar(max)) 
Insert Into @YourTable values 
(1,'12345 BAG 15 LB NR SML BTS CHICKEN MEAL AND RICE') 
,(2,'Some Random Text should be split into 3 strings') 

Declare @MaxLen int = 18 --<< Changed to 18 

    Select A.ID 
      ,Line1 
      ,Line2 = ltrim(stuff(Line2,1,len(Line1),'')) 
      ,Line3 = ltrim(stuff(Line3,1,len(Line2),'')) 
    From @YourTable A 
    Cross Apply (
        Select Line1 = Left(SomeCol,@MaxLen-CharIndex(' ',Reverse(Left(SomeCol,@MaxLen)))) 
          ,Line2 = Left(SomeCol,@MaxLen*2-CharIndex(' ',Reverse(Left(SomeCol,@MaxLen*2)))) 
          ,Line3 = SomeCol 
       ) B  

返回

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 
+0

1,因为它可以适用于广泛的应用,我不认为* OP逻辑会。 – scsimon