2012-08-23 12 views
13

Ich versuche, dies zu tun:Wie speichert man eine Zeichenfolge var größer als varchar (max)?

DECLARE @myVar VARCHAR(MAX) 
Loop with cursor 
select @myVar = @myVar + bla bla bla 
end loop 

Wenn die Schleifenenden, @myVar unvollständig ist, nur 8000 Zeichen enthalten.

Ich habe versucht, Text zu verwenden, ist aber nicht zu lokalen vars erlaubt.

Was wäre eine gute Lösung für diesen Fall?

xml var?

Ich habe gerade diese Beiträge angesehen:

How do I pass a string parameter greater than varchar(8000) in SQL Server 2000?

Check if concatenating to a varchar(max) will go beyond max allowable characters

Und andere über das Web.

Grüße.

+3

Größer als 'varchar (max)' ?? Das sind 2 GB Daten - 2 Milliarden Zeichen - das ist mehr als ** 200 mal ** die Größe des gesamten * War and Peace * Romans von Leo Tolstoj ... und das ist nicht groß genug für dich?!? * * –

+1

@marc_s: Die Frage scheint zu fragen, warum die Variable des Posters nur 8000 Zeichen am Ende der Schleife enthält; Ich denke, der Titel ist irreführend. Vielleicht kann das Plakat bearbeiten, um zu klären, was genau hier gefragt wird. –

+0

@KenWhite: Sehen Sie meine Antwort, wie Sie dieses Problem beheben können. –

Antwort

26

Ernst - VARCHAR(MAX) kann bis zu 2 GB Daten - nicht nur 8000 Zeichen .....

Try this:

DECLARE @myVar VARCHAR(MAX) = '' 

DECLARE @ix INT = 1 

WHILE @ix < 1000 
BEGIN 
    set @myVar = @myVar + CAST('bla bla bla' AS VARCHAR(MAX)) 
    SET @ix = @ix + 1 
END 

SELECT DATALENGTH(@myvar) 

Dies wird ein Wert höher als 8000 Zeichen zurückgeben nach 1000 Iterationen.

Der Punkt ist: Wenn Sie varchar(max) verwenden, müssen Sie sicherstellen, dass immer werfen alle Saiten varchar(max) ausdrücklich - wie ich in diesem Beispiel tat. Andernfalls wird SQL Server auf "normale" varchar Verarbeitung zurückfallen, und das ist in der Tat auf 8000 Zeichen begrenzt ....

+1

Das funktioniert für mich ohne explizite Besetzung. Wo Sie vorsichtig sein müssen, ist die Verwendung von Einbauten wie REPLICATE. –

+0

Ok, ich werde das versuchen. – Eduardo

+1

@AaronBertrand: ahhh .... interessant - ja - es scheint gut zu funktionieren - auch ohne die Besetzung .... hmm .... –