2012-08-23 27 views
13

estoy tratando de hacer esto:¿Cómo almacenar una cadena var mayor que varchar (max)?

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

Cuando termina el bucle, @myVar es incompleta, que contiene sólo 8000 caracteres.

He intentado usar texto, pero no está permitido para los vars locales.

¿Cuál sería una buena solución para este caso?

xml var?

que acaba de mirar esta Mensajes:

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

Y otros a través de la web.

Atentamente.

+3

Mayor que 'varchar (max)' ?? Eso es 2 GB de datos, 2 mil millones de caracteres, eso es más de ** 200 veces ** el tamaño de toda la novela de * Guerra y paz * de Leo Tolstoj ... y eso ** no es lo suficientemente grande para ti?!? * * –

+1

@marc_s: Parece que la pregunta es preguntar por qué la variable del póster solo contiene 8000 caracteres al final del ciclo; Creo que el título es engañoso. Tal vez el póster puede editar para aclarar qué se está preguntando exactamente aquí. –

+0

@KenWhite: vea mi respuesta sobre cómo solucionar este problema. –

Respuesta

26

En serio - VARCHAR(MAX) puede almacenar hasta 2 GB de datos - no sólo los 8000 caracteres .....

Prueba esto:

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) 

Esto devolverá un valor superior de 8000 caracteres después de 1000 iteraciones.

El punto es: si está utilizando varchar(max), es necesario asegurarse de que siempre fundido todas sus cadenas a varchar(max) explícitamente - como lo hice en este ejemplo. De lo contrario, SQL Server recurrirá al procesamiento "normal" varchar, y eso está limitado a 8000 caracteres ....

+1

Esto funciona bien para mí sin el molde explícito. Donde debe tener cuidado es cuando usa complementos como REPLICATE. –

+0

Ok, intentaré esto. – Eduardo

+1

@ AaronBertrand: ahhh .... interesante - sí - parece funcionar bien - incluso sin el elenco .... hmm .... –

Cuestiones relacionadas