2016-06-29 23 views
1

Ich habe eine Tabelle mit langen Strings geteilt durch 200char pro Zeile. Jetzt muss ich sie mit maximal 80char pro Zeile teilen, ist es möglich, es mit einer TSQL-Funktion zu tun oder muss ich schreiben und externes Programm?Resplit lange Strings in TSQL

Dies ist ein Beispiel (Textfeld Länge dann reduziert wird, werde ich mehr Zeilen pro Id haben)

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

Um

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

Google, wie ein Bündel von Zeilen mit mit 1 oder 2 Spalten in 1 Zeile einzuschalten mehrere Spalten, fassen Sie sie zu einer langen Zeichenfolge zusammen und teilen Sie sie dann mit Ihrer neuen Anforderung. – dfundako

+0

Ich würde die Notwendigkeit, die Daten auf einer Datenbankebene zu teilen, in Frage stellen. Meine Präferenz wäre, die Daten in der Tabelle als Zeichenfolgen voller Länge zu speichern und dann die Werte bei der Präsentation der Daten zu teilen (z. B. zu einer Benutzeroberfläche). Warum müssen Sie die Werte in mehrere Zeilen in einer Datenbanktabelle aufteilen? –

+0

@Brian das ist für die Datenmigration zwischen zwei Datenbanken. Der erste hat eine "Note" -Feldgröße, die sich von der zweiten unterscheidet. Ich habe mich nicht für die Tabellenstruktur entschieden, die vom Softwarehaus gegeben wurde. – Tobia

Antwort

0

Dies ist meine Lösung:

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 

Kurze Erklärung:

  • implodieren alle Zeilen in einen String nvarchar (max)

  • Split diese Zeichenfolge in Reihen definierter Größe