我有一个 SQL2008 R2 数据库,其中有几个数据类型为 [IMAGE] 的字段,该字段中的值实际上是代表各种格式的主要是文本的 BLOB。二进制数据由 HP 的服务管理器创建,它们在内部用于填充 GUI 中的表和数组。我正在使用基于 Eclipse 的报告工具 BIRT (4.2) 来收集数据并创建报告。
虽然可以将 IMAGE 转换为表数组,但在许多情况下,性能问题排除了这一点。我正在尝试创建一个完全基于 SQL 的解决方案,以将 IMAGE 翻译和剖析为可读、可用的文本。我关心的二进制字符大多在前 127 个 Unicode 集中,而且都在前 255 个 Unicode 中。在这个范围之外有一堆垃圾可能用于在 GUI 中进行格式化。
我正在寻找一种 SQL 解决方案,用空格或制表符替换基本 Unicode(127 或 255)之外的值。我尝试使用 replace() 失败了,因为它似乎只识别基本的 Unicode 字符。我最好的解决方案是用单个选项卡替换给定 Unicode 范围之外的垃圾块(并且像下面的现有解决方案一样简单)。
我有一个解决方案,将其转换为字符串,其中留下一些垃圾。
select
-- Raw is an image, limited options for cast, so cast it as varbinary
-- Default characters converted is 30 so set to (8000)
-- then cast varbinary to varchar (so a person can read it)
-- substring ignores the first 9 characters after casting
substring (cast (cast (Table.a as varbinary (8000))as varchar(8000)), 9, 7991)as 'SubstringCastCast'
from dbo.Table
我有数据预览的屏幕截图,但发布它的声誉不足,通过复制和粘贴无法很好地传输。
我有另一种解决方案,我可以在其中找到并提取我需要的一块(即 IM0012001234)
select
-- Extract the 12 digit ticket number
substring (CastCast,
-- Find start of Ticket number
charindex('IM',CastCast)
, 12) as 'ETicket'
--Create data set with string that contains ticket, so I can extract it above
from(
select
-- use cast to get a small data set with the ticket number in it
cast (cast (Table.a as varbinary (200))as varchar(200)) as 'CastCast'
from dbo.Table
)InnerQ