Sri*_*ddy 18 sql sql-server-2008
我们在SQL Server中有TestPartner数据库.错误的描述存储在"image"数据类型列中.我们需要编写一个查询来将数据显示为html表.我们有这个查询从相应的表中读取数据以使用xml显示信息For XML.但是将image数据类型转换为varchar会引发异常:"FOR XML无法序列化节点'TD'的数据,因为它包含XML中不允许的字符(0x0002).要使用FOR XML检索此数据,请将其转换为二进制,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
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,它适用于某些记录,并且只要你将大小设置为200即可.它会再次抛出错误.我也尝试过:
Select CONVERT(varchar(1000), convert(varbinary(1000), tpcommanddetail)) From TestPartnerDB.TP_RESULTS_RECORDS
Run Code Online (Sandbox Code Playgroud)
这会为每一行返回奇怪的字符.任何人都可以知道如何使这件事工作.
kri*_*anp 17
简单的答案是
select cast(cast(my_column as varbinary(max)) as varchar(max)) as column_name
from my_table
Run Code Online (Sandbox Code Playgroud)
这会将列转换为varchar格式.如果你有unicode数据,nvarchar(max)可能会更好.
你也可以像这样转换
convert (varchar(max) , convert (varbinary (max) , blob_data)), cast(cast(blob_data as binary) as varchar(max))
Run Code Online (Sandbox Code Playgroud)
我的猜测是,存储在图像列中的数据不是“正常”文本 - 我猜测它是一些任意的数据结构(因此决定使用图像而不是 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
Run Code Online (Sandbox Code Playgroud)