Преобразование типа данных изображения в varchar в sql server 2008

У нас есть база TestPartner в SQL Server. Описания ошибок хранятся в столбце типа данных "образ". Нам нужно написать запрос для отображения данных в виде таблицы html. У нас есть этот запрос, который считывает данные из соответствующих таблиц, чтобы отобразить информацию как xml, используя For XML. Но преобразование типа данных изображения в varchar вызывает исключение: "FOR XML не может сериализовать данные для узла" TD ", потому что он содержит символ (0x0002), который не разрешен в XML. Чтобы получить эти данные с помощью FOR XML, преобразуйте его в двоичный, varbinary или тип данных изображения и использовать директиву BINARY BASE64. ".

Запрос:

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

Удивительно, но это работает для некоторых записей, и как только вы нажимаете размер, чтобы сказать 200. Он снова вызывает ошибку. Я также пробовал:

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

Этот возвращаемый странный символ для каждой строки. Кто-нибудь знает, как заставить эту работу работать.

Ответ 1

Вы также можете конвертировать это

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

Ответ 2

Простой ответ

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

Это преобразует столбец в формат varchar. nvarchar (max) может быть лучше, если у вас есть данные в Юникоде.

Ответ 3

Если данные были сохранены в поле изображения в виде данных Unicode, это не сработает, если вы замените строку. Select CONVERT(nvarchar(1000), convert(varbinary(1000), tpcommanddetail)) From TestPartnerDB.TP_RESULTS_RECORDS с помощью Select CONVERT(varchar(1000), convert(varbinary(1000), tpcommanddetail)) From TestPartnerDB.TP_RESULTS_RECORDS.

Очень важно, чтобы первое преобразование из двоичных данных в текст было выполнено с правильной сортировкой и размером символов: если текст находится в Ascii, вы должны использовать varchar(), и если текст находится в Юникоде, вы должны использовать nvarchar(),

Второе преобразование из nvarchar (100) в varchar (100) выглядит бесполезным для меня.

Использование двоичного кода (100) вместо varbinary (100) также выглядит очень подозрительным для меня.

Наконец, если вы получаете странные символы, такие как 0x0002, возможно, именно поэтому это было сохранено в поле изображения вместо текстового поля: это специально сформированное поле, где не все символы являются текстовыми символами. Однако, поскольку вы не показали нам результат печати исходного поля в двоичном (точнее, в шестнадцатеричном) или любом из ваших результатов, невозможно сказать ничего больше.

Я только что приготовил несколько тестов; с ними вы должны понимать, что происходит:

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');

Ответ 4

Я предполагаю, что данные, хранящиеся в вашем столбце изображения, не являются "нормальным" текстом - я бы предположил, что это какая-то произвольная структура данных (следовательно, решение использовать образ, а не varchar)?

Я пробовал это без проблем:

    declare @data varchar(max)

    declare @fred 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 @fred (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 @fred (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 @fred FOR XML PATH('tr'), TYPE)

    select @xml

Ответ 5

Попробуйте этот код:

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