2012-08-23 12 views
13

Próbuję to zrobić:Jak przechowywać ciąg znaków var większy niż varchar (max)?

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

Kiedy końce pętli, @myVar jest niekompletny, zawierających tylko 8000 znaków.

Próbowałem użyć tekstu, ale nie jest dozwolone na lokalnych zmiennych.

Co byłoby dobrym rozwiązaniem w tej sprawie?

xml var?

właśnie wyglądało to posty:

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

a inni poprzez sieć.

Pozdrawiam.

+3

Większy niż 'varchar (max)' ?? To 2 GB danych - 2 miliardy znaków - to więcej niż ** 200 razy ** wielkości całej powieści * Wojna i pokój * Leo Tolstoj .... i to ** nie jest wystarczająco duże dla ciebie?!? * * –

+1

@marc_s: Pytanie wydaje się pytać, dlaczego zmienna plakatu zawiera tylko 8000 znaków na końcu pętli; Myślę, że tytuł jest mylący. Być może plakat można edytować, aby wyjaśnić, o co konkretnie tu chodzi. –

+0

@KenWhite: zobacz moją odpowiedź, aby rozwiązać ten problem. –

Odpowiedz

26

Poważnie - VARCHAR(MAX) można przechowywać do 2 GB danych - nie tylko 8000 znaków .....

Spróbuj tego:

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) 

ta zwróci wartość wyższa niż 8000 znaków po 1000 iteracjach.

Chodzi o to: jeśli używasz varchar(max), trzeba upewnić się, że zawsze cast wszystkie sznurki do varchar(max) sposób jawny - tak jak ja w tym przykładzie. W przeciwnym razie SQL Server powróci do "zwykłego" przetwarzania varchar, a to faktycznie ograniczone do 8000 znaków ....

+1

To działa dobrze dla mnie bez wyraźnej obsady. Gdzie musisz być ostrożny, gdy używasz wbudowanych takich jak REPLICATE. –

+0

OK, spróbuję tego. – Eduardo

+1

@AaronBertrand: ahhh .... ciekawe - tak - wygląda na to, że działa dobrze - nawet bez obsady ... hmm .... –