2016-06-29 15 views
1

長い文字列のテーブルを行ごとに200charで分割しました。 今私は行ごとに最大80文字でそれらを再分割する必要があります、TSQL関数でそれを行う可能性がありますか、または外部プログラムを記述する必要がありますか?TSQLで長い文字列を分割する

これは一例です(テキストフィールドな長さが低減され、その後、私はIDごとより多くの行を持つことになります)

+----+----------------------------+ 
| Id | TextLong     | 
+----+----------------------------+ 
| 1 | Long text chunked part 1/3 | 
+----+----------------------------+ 
| 1 | Long text chunked part 2/3 | 
+----+----------------------------+ 
| 1 | Long text chunked part 3/3 | 
+----+----------------------------+ 
| 2 | Long text chunked part 1/2 | 
+----+----------------------------+ 
| 2 | Long text chunked part 2/2 | 
+----+----------------------------+ 

+----+------------------------+ 
| Id | TextSmall    | 
+----+------------------------+ 
| 1 | Long text chunked  | 
+----+------------------------+ 
| 1 | part 1/3Long text  | 
+----+------------------------+ 
| 1 | chunked part 2/3 Long | 
+----+------------------------+ 
| 1 | text chunked part 3/3 | 
+----+------------------------+ 
| 2 | Long text chunked  | 
+----+------------------------+ 
| 2 | part 1/2 Long text  | 
+----+------------------------+ 
| 2 | chunked part 2/2  | 
+----+------------------------+ 
+0

グーグル1つの長い文字列に連結し、次に新しい要件を使用して分割します。 – dfundako

+0

私はデータベースレベルでデータを分割する必要があると思います。私の好みは、フルサイズの文字列としてテーブルにデータを格納し、次にデータを提示するときに値を分割することです(UIなど)。なぜあなたは、データベーステーブル内の複数の行に値を分割する必要があると思いますか? –

+0

@Brianこれは2つのデータベース間のデータ移行用です。最初のものは、第2のものとは異なる「メモ」フィールドサイズを有する。私はソフトウェアハウスから与えられたテーブル構造を決定しませんでした。 – Tobia

答えて

0

これは私のソリューションです:

CREATE FUNCTION [dbo].[resplit] (@id int, @len int) 
RETURNS 
@returnList TABLE (id int IDENTITY(1,1), txt nvarchar(max)) 
AS 
BEGIN 

if @id is null 
    return 

DECLARE @fulltxt nvarchar(max)='' 
DECLARE @rowList TABLE (id int IDENTITY(1,1) PRIMARY KEY, txt nvarchar(max), processed int default 0) 
DECLARE @name NVARCHAR(255), @value NVARCHAR(255), @tmp NVARCHAR(255) 
DECLARE @pos INT 

insert into @rowList(txt) select LTRIM(RTRIM(nota)) from sourceTable where [email protected] 

if (Select Count(*) From @rowList) = 0 
    return 

While (Select Count(*) From @rowList Where Processed = 0) > 0 
    Begin 
     Select Top 1 @tmp = txt, @pos=id From @rowList Where Processed = 0 order by id 
     set @[email protected]+isnull(@tmp,'') 
     Update @rowList Set processed = 1 Where id = @pos 
    End 

While len(@fulltxt)>0 
    Begin 
     set @[email protected] 
     set @tmp = SUBSTRING(@fulltxt, 0, @pos) 
     insert into @returnList(txt) select @tmp 
     if len(@fulltxt)[email protected]<=0 
      set @fulltxt='' 
     else 
      set @fulltxt=SUBSTRING(@fulltxt, @pos+1, len(@fulltxt)[email protected]) 
    End 

RETURN 
END 

短い説明:

  • 破定義されたサイズの行に1つのストリングNVARCHAR(MAX)

  • スプリットこの文字列にすべての行と1列に1つの又は2列と行の束を有効にする方法