【问题标题】:How to replace non-standard Unicode with Space or Tab using SQL如何使用 SQL 将非标准 Unicode 替换为空格或制表符
【发布时间】:2013-02-28 12:45:35
【问题描述】:

我有一个 SQL2008 R2 数据库,其中有几个数据类型为 [IMAGE] 的字段,字段中的值实际上是代表各种格式的 BLOB,主要是文本。二进制数据由 HP 的服务管理器创建,它们在内部用于填充 GUI 中的表和数组。我正在使用基于 Eclipse 的报告工具 BIRT (4.2) 来收集数据并创建报告。

虽然可以将 IMAGE 转换为表数组,但在许多情况下,性能问题会排除这种情况。我正在尝试创建一个完全基于 SQL 的解决方案,以将 IMAGE 翻译和剖析为可读、可用的文本。我关心的二进制字符大多在前 127 个 Unicode 集中,而且都在前 255 个 Unicode 中。有一堆超出此范围的垃圾可能用于在 GUI 中进行格式化。

我正在寻找一种用空格或制表符替换基本 Unicode(127 或 255)之外的值的 SQL 解决方案。我尝试使用 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

【问题讨论】:

    标签: sql eclipse birt


    【解决方案1】:

    我编写了一个函数,可以去除除 A-Z a-z 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
    

    【讨论】:

    • 谢谢,这是我第一次尝试在 SQL 中使用函数,所以在我应用和自定义它时速度变慢了。
    • 再次感谢,我已经在我的测试服务器上启动并运行它,并且刚刚开始尝试定制它以满足我的需求。它似乎像宣传的那样工作。
    • @JamesJenkins 很高兴我能帮上忙 :)
    猜你喜欢
    • 2015-11-01
    • 2013-05-01
    • 2016-05-02
    • 2017-10-15
    • 2020-03-11
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多