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文字を超える場合、その制限がヒットする前の最後のスペースを見つけ出し、元の文字列から切り捨てて、次の行の次の文字列に追加します。
これは、より良いコードレビューに掲載されます。 https://codereview.stackexchange.com/ –
これを行うには他にもたくさんの方法があります。この質問は、最後の行が7500文字のときにどうなるのですか? – Hogan
あなたはそれが長すぎることを望んでいますか?また、これを一連のデータに適用しようとしていますか?もしそうなら、あなたの現在のロジックに基づいてどこかにループがあると思います。これは本当ですか? – scsimon