2

我有一个 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
4

1 回答 1

1

我编写了一个函数,可以去除除 AZ az 0-9 以外的任何内容......也许这会有所帮助(根据您的需要进行调整,您可以放入ELSE ' '字符无法识别的空间):

CREATE FUNCTION [dbo].[StripPunctuation]
(
@String VARCHAR(255)
)

RETURNS VARCHAR(255) AS

/*
$   Description: Strips out all non alpha-numeric
$             characters from a string
$
*/

BEGIN

DECLARE @i INT
DECLARE @Char CHAR(1)
DECLARE @Wk VARCHAR(255)

-- Only copy 0-9, a-z, A-Z.

SET @Wk = ''
SET @i = 1
WHILE @i <= LEN(@String)
BEGIN
   SET @Char = SUBSTRING(@String, @i, 1)
   IF (ASCII(@Char)  > 47) AND (ASCII(@Char)  < 58)
      SET @Wk = @Wk + @Char
   IF (ASCII(@Char)  > 64) AND (ASCII(@Char)  < 91) 
      SET @Wk = @Wk + @Char
   IF (ASCII(@Char)  > 96) AND (ASCII(@Char)  < 123) 
      SET @Wk = @Wk + @Char
   SET @i = @i +1
END

RETURN @Wk

END
于 2013-02-28T12:52:22.553 回答