Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SQL将非标准Unicode替换为空格或制表符_Sql_Eclipse_Birt - Fatal编程技术网

如何使用SQL将非标准Unicode替换为空格或制表符

如何使用SQL将非标准Unicode替换为空格或制表符,sql,eclipse,birt,Sql,Eclipse,Birt,我有一个SQL2008 R2数据库,其中有几个字段的数据类型为[IMAGE],字段中的值实际上是表示各种格式的blob,其中大部分是文本。二进制数据由HP的Service Manager创建,在内部用于填充GUI中的表和数组。我正在使用基于Eclipse的报告工具BIRT(4.2)来收集数据和创建报告 虽然可以将映像转换为表数组,但在许多情况下,性能问题排除了这一点。我正在尝试创建一个完全基于SQL的解决方案,以将图像转换和解析为可读、可用的文本。我所关心的二进制字符主要在前127个Unicod

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

虽然可以将映像转换为表数组,但在许多情况下,性能问题排除了这一点。我正在尝试创建一个完全基于SQL的解决方案,以将图像转换和解析为可读、可用的文本。我所关心的二进制字符主要在前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)


我写了一个函数,它可以去掉除a-Z a-Z 0-9之外的任何东西。。。也许这会有所帮助(调整以满足您的需要,您可以在
ELSE''
中放入无法识别字符的空间):

CREATE函数[dbo].[stripe标点符号]
(
@字符串VARCHAR(255)
)
将VARCHAR(255)返回为
/*
$Description:去掉所有非字母数字
字符串中的$个字符
$
*/
开始
声明@i INT
声明@Char(1)
声明@Wk VARCHAR(255)
--只复制0-9,a-z,a-z。
设置@Wk=''
设置@i=1
而@i 47)和(ASCII(@Char)<58)
设置@Wk=@Wk+@Char
如果(ASCII(@Char)>64)和(ASCII(@Char)<91)
设置@Wk=@Wk+@Char
如果(ASCII(@Char)>96)和(ASCII(@Char)<123)
设置@Wk=@Wk+@Char
设置@i=@i+1
结束
返回@Wk
结束

谢谢,这是我第一次尝试在SQL中使用函数,因此在应用和自定义它时速度很慢。再次感谢,我已经在测试服务器上安装并运行了它,并且刚刚开始尝试自定义它以满足我的需要。“它似乎和广告上宣传的一样有效。”@JamesJenkins很高兴我能帮上忙:)
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
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