2017-04-17 13 views
0

は、IDで構成されるテーブルを持ってNotes、LEN(注)、およびLEN/60SQL Serverの:LENに基づいて複数行に分割テキストフィールドルール

私は= 60 LENのチャンクにそれを分割する必要があります各行に対して1ずつ増加する新しい「LINE」列を追加します。だから、

1 | Super long text of 150 characters | 150 | 3 

は次のようになります。

- 1 | 1 | Super long text of 150 
- 1 | 2 | characters is much more 
- 1 | 3 | manageable! 

私はLENとLENを作成/セグメント値の場合で60のデータがループ文のいくつかの種類に有用であろう。

再帰的なCTE、ループ、変数 - 私はこの時点で何かにオープンしています!

ありがとうございました!

+3

IMHOでは、必要以上にデータの保存とデータの取得が困難になっています。 SQL Serverは長いテキストを扱うことができ、アプリケーション内ですべてのレコードが1つのレコードに含まれていると、読みやすく解析するのがずっと簡単です。 –

+0

あなたの意見に完全に同意します。残念ながら、このソリューションは、行ごとに60文字を超えない複数の広告申込情報を処理するように構築されているため、このソリューションを推進しています。 – chaseman1973

答えて

1

はい。 CTEが答えです。これを試してください。

WITH cte_base AS(SELECT ID 
        , 1 AS IDLN 
        , LTRIM(RTRIM(Notes)) AS Notes 
        , 1 AS Rownum 
       FROM yourtable 
), cte_re AS (SELECT Id 
        , IDLN 
        , 1 AS StartPos 
        , CAST(60 - CHARINDEX(' ', REVERSE(LEFT(SUBSTRING(Notes, 1, 60) + ' ', 60))) AS INT) StringLen 
       FROM cte_base 
       WHERE Rownum =1 
       UNION ALL 
       SELECT r.Id 
        , r.IDLN + 1 
        , StartPos + StringLen + 1 
        , CAST(60 - CHARINDEX(' ', REVERSE(LEFT(SUBSTRING(b.Notes, StartPos + StringLen + 1, 60) + ' ', 60))) AS INT) 
       FROM CTE_re r 
       INNER JOIN cte_base b 
        ON b.Id = r.Id and b.rownum = 1 
       WHERE StartPos + StringLen <= DATALENGTH(b.Notes) 
)  
SELECT r.Id 
    , r.IDLN 
    , UPPER(SUBSTRING(b.Notes, r.StartPos, r.StringLen)) AS Notes 
FROM cte_re r 
INNER JOIN cte_base b 
ON r.Id = b.Id; 
+0

ありがとう、ウェンディ!これはスーパークローズですが、2つの問題が発生しています: 1:2つ以上のセグメントを持つ行は余分な "空白"の行になります。したがって、長さが110のID 1771は2行(IDLN 1と2)になりますが、最後の2つは空白のNotes値を持つ4となります 2:IDを指定せずにコードを実行すると、メッセージ530、 "..最大再帰100はステートメントの完了前に使い果たされました"というエラーです。 もう少し私を助けることができますか? – chaseman1973

+0

サンプルデータを入力してください。 – Wendy

関連する問題