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