在sql server 2008中将图像数据类型转换为varchar
我们在SQL Server中有TestPartner数据库。错误的描述存储在图像数据类型列中。我们需要编写一个查询来将数据显示为html表。我们有一个查询,它从相应的表中读取数据,并使用For xml将信息显示为xml。但是将图像数据类型转换为varchar会引发一个异常:FOR XML无法序列化节点“TD”的数据,因为它包含XML中不允许的字符0x0002。要使用FOR XML检索此数据,请将其转换为binary、varbinary或image数据类型,并使用binary BASE64指令 查询:在sql server 2008中将图像数据类型转换为varchar,sql,sql-server-2008,Sql,Sql Server 2008,我们在SQL Server中有TestPartner数据库。错误的描述存储在图像数据类型列中。我们需要编写一个查询来将数据显示为html表。我们有一个查询,它从相应的表中读取数据,并使用For xml将信息显示为xml。但是将图像数据类型转换为varchar会引发一个异常:FOR XML无法序列化节点“TD”的数据,因为它包含XML中不允许的字符0x0002。要使用FOR XML检索此数据,请将其转换为binary、varbinary或image数据类型,并使用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
这将返回每行的奇怪字符。任何人都知道如何让这个东西工作。我的猜测是,存储在图像列中的数据不是“正常”文本-我猜它是某种任意的数据结构,因此决定使用图像而不是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
如果数据已作为Unicode数据存储在图像字段中,则如果将TestPartnerDB.TP_结果_记录中的Select CONVERTvarchar1000、convertvarbinary1000、tpcommanddetail行替换为TestPartnerDB.TP_结果_记录中的Select CONVERTvarchar1000、convertvarbinary1000、tpcommanddetail行,则无法工作 从二进制数据到文本的第一次转换必须使用正确的排序规则和字符大小,这一点非常重要:如果文本是Ascii,则必须使用varchar;如果文本是Unicode,则必须使用nvarchar 从nvarchar100到varchar100的第二次转换在我看来毫无用处 使用binary100代替varbinary100在我看来也很可疑 最后,如果您得到像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');
你也可以这样转换
convert (varchar(max) , convert (varbinary (max) , blob_data)), cast(cast(blob_data as binary) as varchar(max))
简单的答案是
select cast(cast(my_column as varbinary(max)) as varchar(max)) as column_name
from my_table
这会将列转换为varchar格式。如果您有unicode数据,nvarcharmax可能会更好。请尝试以下代码:
Select MASTER.dbo.Fn_varbintohexstr(tpcommanddetail) From TestPartnerDB.TP_RESULTS_RECORDS
这必须是一个大的WTF来将文本数据存储在二进制字段中-祝你好运…这个解决方案有效,但它截断了结果字符串。最后我使用了selectconvertxml、CONVERTvarbinaryMAX和字段
Select MASTER.dbo.Fn_varbintohexstr(tpcommanddetail) From TestPartnerDB.TP_RESULTS_RECORDS