Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Problema con XML y NVARCHAR(MAX)

Estas en el tema de Problema con XML y NVARCHAR(MAX) en el foro de SQL Server en Foros del Web. Tengo un reporte que mando todos los días por medio de un SP y un JOB en formato HTML, pero al modificarlo y agregarle más ...
  #1 (permalink)  
Antiguo 27/01/2009, 13:30
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Problema con XML y NVARCHAR(MAX)

Tengo un reporte que mando todos los días por medio de un SP y un JOB en formato HTML, pero al modificarlo y agregarle más columnas resulta que se trunca.

Reviso y veo que aparentemente se ha llegado al límite de la variable nvarchar(max) que utilizo para concatenar los encabezados con el cuerpo del correo pero veo que no es así, me explico:

Esta consulta es la que forma el cuerpo del correo:

Cita:
select td = Cliente, '', td = NoRemision, '', td = IDRollo, '', td = NoParte, '', td = Dimension, '', td = Spec, '', td = Factura, '', td = Inspec, '', td = Peso, '', td = PPT, '', td = Costo, ''
from Nicometal.dbo.vw_EntregaDiaria
order by NoRemision, IDRollo
Pero revisando su extensión como resultado XML con datalength veo que solo ocupa 5231 bytes:

Cita:
select [datalength] = datalength((select td = Cliente, '', td = NoRemision, '', td = IDRollo, '', td = NoParte, '', td = Dimension, '', td = Spec, '', td = Factura, '', td = Inspec, '', td = Peso, '', td = PPT, '', td = Costo, ''
from Nicometal.dbo.vw_EntregaDiaria
order by NoRemision, IDRollo
for xml path( 'tr' ), type))
y si veo lo que ocupa sin convertirla a XML sino solo como texto, ocupa 8208 bytes:
Cita:
select [datalength] = datalength((select td = Cliente, '', td = NoRemision, '', td = IDRollo, '', td = NoParte, '', td = Dimension, '', td = Spec, '', td = Factura, '', td = Inspec, '', td = Peso, '', td = PPT, '', td = Costo, ''
from Nicometal.dbo.vw_EntregaDiaria
order by NoRemision, IDRollo
for xml path( 'tr' )))
Desde ahí ya no entendí el por que de el aumento, pero lo que si me afecta es que como texto no cabe el resultado completo, y es que necesito que sea texto por que debo concatenar los encabezados personalizados de la tabla y del correo. Entonces si no la convierto a nvarchar con un Convert marca un error de conversión implícita del tipo de datos xml a nvarchar(max).

Cita:
declare @qr as nvarchar(max)
select @qr =cast( (select td = Cliente, '', td = NoRemision, '', td = IDRollo, '', td = NoParte, '', td = Dimension, '', td = Spec, '', td = Factura, '', td = Inspec, '', td = Peso, '', td = PPT, '', td = Costo, ''
from Nicometal.dbo.vw_EntregaDiaria
order by NoRemision, IDRollo
for xml path( 'tr' ), type) as nvarchar(max) )
print @qr
Ese as nvarchar(max) es el que me trunca el resultado, pero no lo entiendo por que haciendo mis pruebas una variable nvarchar(max) puede recibir mucho más que esos 8000 bytes

Cita:
declare @sql nvarchar(max)
set @sql = N'select [Inicio]=1,' + replicate(convert(nvarchar(max),N' '),30000) + N'[Fin]=999'
select [datalength @sql] = datalength(@sql)
Esa prueba metió 60,000 bytes sin problemas, entonces .....

Que esta pasando??!!!

No alcanzo a comprender como solucionar esto
  #2 (permalink)  
Antiguo 27/01/2009, 15:41
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Respuesta: Problema con XML y NVARCHAR(MAX)

Interesante ....

El "problema" no estaba en la información sino en el método que utilizaba para visualizar los resultados:
Cita:
PRINT (Transact-SQL)

Devuelve al cliente un mensaje definido por el usuario.

Icono de vínculo a temas Convenciones de sintaxis de Transact-SQL
Sintaxis

PRINT msg_str | @local_variable | string_expr

Argumentos

msg_str

Es una cadena de caracteres o una constante de cadena Unicode. Para obtener más información, vea Constantes (Transact-SQL).

@ local_variable

Es una variable de cualquier tipo de datos de caracteres válido. @local_variable debe ser char o varchar, o bien se debe poder convertir implícitamente a estos tipos de datos.

string_expr

Es una expresión que devuelve una cadena. Puede incluir valores literales concatenados, funciones y variables. Para obtener más información, vea Expresiones (Transact-SQL).

Notas

Una cadena de mensaje puede tener una longitud de hasta 8.000 caracteres si es una cadena no Unicode, y de 4.000 caracteres si es una cadena Unicode. Las cadenas de mayor longitud se truncarán.
plop!

En lugar de ello, usé select para desplegar las variables y no las concatené sino que use las propias salidas de las consultas y listo; aunque como nota curiosa vi que al desplegar la variable con el HTML ya formado el antivirus McAFee truena el proceso SqlWb.exe por considerarlo un troyano (Exploit-ObscuredHtml)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:20.