SQL Reverse auf CHAR(13)CHAR(10) MS SQL 2008

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.061
Ich brauche die Position des Zeilenumbruchs an der letzte Stelle. In C# ist es einfach, da tippt man "".LastIndexOf("\r\n"). Aber in MS SQL ist es anders, da es keine LASTINDEXOF procedure gibt. Also muss ich zuerst den text umdrehen und diesen dann nach charindex absuchen.

Das Problem ist, die umbruchzeichen lassen sich nicht alle beseitigen! Ich bekomme beim CHAR(10)+CHAR(13) den CHAR(13) doch angezeigt!

Kann da jemand helfen?

Code:
declare	@from		int,
		@string		nvarchar(max),
		@maxlen		int,
		@current	nvarchar(max),
		@creversed	nvarchar(max),
		@index_f	int,
		@index_l	int,
		@index		int,		   -- index aus dem String @index_on
		@string_l	nvarchar(max),
		@len		int,
		@counter	int
set @string =	'1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234' + CHAR(13) + CHAR(10) +
				'567890 1234567890 1234567890 ' + CHAR(10) + CHAR(13) + '1234567890 1234567890 1234567890 12345678' +
				'abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghijklmnop' + CHAR(10) +
				'qrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcde' + CHAR(13) +
				'fghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstu'
set @from = 1
set @maxlen = 60
set @counter = 1

--set @ret = CHAR(10) + CHAR(13)
--print left(@string, len(@string) - charindex(@lf, reverse(@string)))

while @from <= LEN(@string)
begin
	set @index = 0
	set @current = substring(@string, @from, @maxlen)
	set @creversed = REVERSE(@current)
	/*print @current
	print @creversed
	print @counter
	print ''*/
	set @counter = @counter + 1
	
	---Einmal vorne und einmal hinten die ergebnisse vergleichen um zu entscheiden, wo der String geschnitten wird
	set @index_l = CHARINDEX(CHAR(10) + CHAR(13), @creversed)	--suche nach \r\n
	set @index_f = CHARINDEX(CHAR(13) + CHAR(10), @current)	--suche nach \r\n
	set @len = 2
	if(@index_l > 0) begin set @index_l = LEN(@current) - (@index_l + 1); end
	if(@index_f >= @index_l)
	begin set @index = @index_l end 
	else begin set @index = @index_f end
	
	if (@index = 0)
	begin
		set @index_l = CHARINDEX(CHAR(13) + CHAR(10), @creversed) --suche nach \n\r (eigentlich sollte sowas nicht geben aber was solls.
		set @index_f = CHARINDEX(CHAR(10) + CHAR(13), @current)
		set @len = 2
		if(@index_l > 0) begin set @index_l = LEN(@current) - (@index_l + 1); end -- damit man ja auch mit char(10) das ganze angefangen wird.
		if(@index_f >= @index_l)
		begin set @index = @index_l end 
		else begin set @index = @index_f end
		
		if(@index = 0)
		begin
			set @index_l = CHARINDEX(CHAR(13), @creversed)	--suche nach \r
			set @index_f = charindex(CHAR(13), @current)
			set @len = 1
			if(@index_l > 0) begin set @index_l = LEN(@current) - @index_l; end
			if(@index_f > @index_l)
			begin set @index = @index_l end 
			else begin set @index = @index_f end
			
			if(@index = 0)
			begin
				set @index_l = CHARINDEX(CHAR(10), @creversed)--suche nach \n
				set @index_f = charindex(CHAR(10), @current)
				set @len = 1
				if(@index_l > 0) begin set @index_l = LEN(@current) - @index_l; end
				if(@index_f > @index_l)
				begin set @index = @index_l end 
				else begin set @index = @index_f end
				
				if(@index = 0)
				begin
					set @index = LEN(@current) - CHARINDEX(' ', @creversed) --suche nach Leeren Zeichen
					set @len = 1
				end
			end
		end
	end
	if(@index = 0)
	begin
		set @string_l = @current
		set @len = 0;
		--print CHAR(10) + 'Index 0'
	end
	else
	begin
		--print CHAR(10) + 'Index ' + cast(@index as varchar)
		set @string_l = left(@current, @index)
	end
	
	--print 'FROM : ' + cast(@from as varchar) + ' INDEX : ' + cast(@index as varchar) + ' String L : ' + cast(len(@string_l) as varchar)
	set @from += LEN(@string_l) + @len --(@maxlen - @index)
	--print 'FROM : ' + cast(@from as varchar) + ' INDEX : ' + cast(@index as varchar) + ' String L : ' + cast(len(@string_l) as varchar)
	--print @string_l
	print replace(replace(replace(replace(@string_l, CHAR(13) + CHAR(10), 'CHAR(13) + CHAR(10)'), CHAR(10) + CHAR(13), 'CHAR(10) + CHAR(13)'), CHAR(13), 'CHAR(13)'), CHAR(10), 'CHAR(10)')
	set @string_l = ''
end
 
Hallo roker002,

\r -> Wagenrücklauf; CHAR(13); neuer Absatz
\n -> Zeilenvorschub; CHAR(10); Zeilenumbruch

"\r\n" = "CHAR(13)+CHAR(10)" = neuer Absatz, dann neue Zeile

Ich brauche die Position des Zeilenumbruchs an der letzte Stelle.
Suchst du wirklich nur den Zeilenumbruch CHAR(10)
oder genügt auch ein alleinstehendes Absatzzeichen CHAR(13)?

Hier ein Beispiel, das nach beiden Umbruchzeichen sucht:
PHP:
DECLARE @strText	 nvarchar(max),
		@strTextNeu  nvarchar(max),
		@intIndex	int
SET @strText  = '1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234' + CHAR(13) + CHAR(10) +
				'567890 1234567890 1234567890 ' + CHAR(10) + CHAR(13) + '1234567890 1234567890 1234567890 12345678' +
				'abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghijklmnop' + CHAR(10) +
				'qrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcde' + CHAR(13) +
				'fghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstu'

SET @strTextNeu = REPLACE( REPLACE(@strText,CHAR(10),'#') ,CHAR(13),'#')
SET @intIndex   = LEN(@strTextNeu) - CHARINDEX('#', REVERSE(@strTextNeu))
PRINT @intIndex
 
Zuletzt bearbeitet:
Zurück
Oben