Convierta el tipo de datos de image en varchar en el server sql 2008

Tenemos la database TestPartner en SQL Server. Las descripciones de los errores se almacenan en la columna de tipo de datos "image". Necesitamos escribir una consulta para mostrar los datos como tabla html. Tenemos esta consulta que lee los datos de las tablas respectivas para mostrar la información como xml usando For XML . Pero la conversión del tipo de datos de image a varchar arroja una exception: "FOR XML no pudo serializar los datos para el nodo 'TD' porque contiene un carácter (0x0002) que no está permitido en XML. Para recuperar estos datos usando FOR XML, conviértalos en binarys , varbinary o tipo de datos de image y usan la directiva BINARY BASE64. ".

Consulta:

 DECLARE @ResultsTable nvarchar(MAX) --Create the XML table with the query results SET @ResultsTable = N'<H3>QA Automation Tests Results Summary </H3>' + N'<table border="1">' + N'<tr><th>Test Name</th><th>Execution Date</th>' + N'<th>Check Name</th><th>Description</th></tr>' + CAST ( ( select distinct Name as TD, '', (Select CAST(CONVERT(nchar(100),CAST( TPCommandDetail AS BINARY(100) )) as VARCHAR(100)) ) as TD, '' FROM TestPartnerDB.TP_RESULTS_RECORDS FOR XML PATH('tr'), TYPE ) AS nvarchar(max) ) + N'</table>' SELECT @ResultsTable 

Sorprendentemente funciona para algunos loggings y tan pronto como topes el tamaño para decir 200. Se arroja el error de nuevo. También probé:

 Select CONVERT(varchar(1000), convert(varbinary(1000), tpcommanddetail)) From TestPartnerDB.TP_RESULTS_RECORDS 

Este personaje extraño regresa para cada fila. ¿Alguien puede saber cómo hacer que esto funcione?

Puedes convertir también así

 convert (varchar(max) , convert (varbinary (max) , blob_data)), cast(cast(blob_data as binary) as varchar(max)) 

La respuesta simple es

 select cast(cast(my_column as varbinary(max)) as varchar(max)) as column_name from my_table 

Esto convierte la columna a formatting varchar. nvarchar (max) podría ser mejor si tiene datos Unicode.

Si los datos se almacenaron en el campo de image como datos Unicode, no funcionarán si reemplaza la línea. Select CONVERT(nvarchar(1000), convert(varbinary(1000), tpcommanddetail)) From TestPartnerDB.TP_RESULTS_RECORDS con Select CONVERT(varchar(1000), convert(varbinary(1000), tpcommanddetail)) From TestPartnerDB.TP_RESULTS_RECORDS .

Es muy importante que la primera conversión de datos binarys a text se realice con la queueción correcta y el tamaño de los caracteres: si el text está en Ascii, debe usar varchar () y si el text está en Unicode, debe usar nvarchar () .

La segunda conversión de nvarchar (100) a varchar (100) me parece inútil.

El uso de binary (100) en lugar de varbinary (100) también me parece muy sospechoso.

Finalmente, si obtienes caracteres extraños como 0x0002, quizás sea por eso que se haya almacenado en un campo de image en lugar de en un campo de text: se trata de un campo con formatting especial donde no todos los caracteres son caracteres de text. Sin embargo, como no nos mostró el resultado de imprimir el campo original en formatting binary (o más exactamente, en hexadecimal) o de cualquiera de sus resultados, es imposible decir algo más.

Acabo de preparar algunas testings; con esto, deberías ser capaz de entender lo que está sucediendo:

 select ascii ('A'), unicode(N'A'); select convert (binary(2), ascii('A')), convert (binary(2), unicode(N'A')); -- declare @ab binary(10), @vab varbinary(10); declare @nab binary(10), @vnab varbinary(10); -- set @ab = convert (binary (10), 'AB'); set @vab = convert (varbinary (10), 'AB'); set @nab = convert (binary (10), N'AB'); set @vnab = convert (varbinary (10), N'AB'); -- select @ab, @vab, @nab, @vnab; -- select convert(varchar(10), @ab) + '*', convert(varchar(10), @vab) + '*', convert(varchar(10), @nab) + '*', convert(varchar(10), @vnab) + '*'; -- select len(convert(varchar(10), @ab)), len(convert(varchar(10), @vab)), len(convert(varchar(10), @nab)), len(convert(varchar(10), @vnab)); -- select len(convert(varchar(10), @ab) + '*'), len(convert(varchar(10), @vab) + '*'), len(convert(varchar(10), @nab) + '*'), len(convert(varchar(10), @vnab) + '*'); -- select convert(nvarchar(10), @ab) + '*', convert(nvarchar(10), @vab) + '*', convert(nvarchar(10), @nab) + '*', convert(nvarchar(10), @vnab) + '*'; -- select len(convert(nvarchar(10), @ab)), len(convert(nvarchar(10), @vab)), len(convert(nvarchar(10), @nab)), len(convert(nvarchar(10), @vnab)); -- select convert(varchar(10), convert(nvarchar(10), @ab)) + '*', convert(varchar(10), convert(nvarchar(10), @vab)) + '*', convert(varchar(10), convert(nvarchar(10), @nab)) + '*', convert(varchar(10), convert(nvarchar(10), @vnab)) + '*'; -- select len(convert(varchar(10), convert(nvarchar(10), @ab))), len(convert(varchar(10), convert(nvarchar(10), @vab))), len(convert(varchar(10), convert(nvarchar(10), @nab))), len(convert(varchar(10), convert(nvarchar(10), @vnab))); -- select convert(nvarchar(10), @nab) for xml path('tr'); select convert(varchar(10), convert(nvarchar(10), @nab)) for xml path('tr'); select 'The Name' as td, '', convert(nvarchar(10), @nab) as td for xml path('tr'); 

Supongo que los datos almacenados en la columna de tu image no son texts "normales", supongo que se trata de una estructura de datos arbitraria (de ahí la decisión de usar imágenes en lugar de varchar) .

Intenté esto sin ningún problema:

  declare @data varchar(max) declare @fnetworking table (d1 varchar(max), d2 xml, d3 image) set @data = 'here is some data' while (len(@data) < 200) set @data = @data + ' ' + cast(rand() as varchar) insert into @fnetworking (d1,d2,d3) values (@data,@data,@data) set @data = 'here is some more data' while (len(@data) < 200) set @data = @data + ' ' + cast(rand() as varchar) insert into @fnetworking (d1,d2,d3) values (@data,@data,@data) declare @xml xml set @xml = (select cast(cast(d3 as varbinary(max)) as varchar(max)) as 'td' from @fnetworking FOR XML PATH('tr'), TYPE) select @xml 

Prueba este código:

 Select MASTER.dbo.Fn_varbintohexstr(tpcommanddetail) From TestPartnerDB.TP_RESULTS_RECORDS