如何使用SQL用Space或Tab替换非标准Unicode

时间:2013-02-28 12:45:35

标签: sql eclipse birt

我有一个SQL2008 R2数据库,其中几个字段的数据类型为[IMAGE],字段中的值实际上是BLOB,表示大多数文本的不同格式。二进制数据由HP的Service Manager创建,它们在内部用于填充GUI中的表和数组。我正在使用BIRT(4.2)基于Eclipse的报告工具来收集数据和创建报告。

虽然可以将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

1 个答案:

答案 0 :(得分: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