2

データ型[IMAGE]のいくつかのフィールドを持つSQL2008R2データベースがあります。フィールドの値は、実際にはほとんどがテキストのさまざまな形式を表すBLOBです。バイナリデータは、HPのService Managerによって作成され、GUIのテーブルと配列にデータを入力するために内部的に使用されます。EclipseベースのレポートツールであるBIRT(4.2)を使用して、データを収集し、レポートを作成しています。

IMAGEをテーブル配列に変換することは可能ですが、パフォーマンスの問題により、多くの場合それができなくなります。私は、IMAGEを読み取り可能で使用可能なテキストに変換および分析するための完全なSQLベースのソリューションを作成しようとしています。私が気にかけているバイナリ文字は、ほとんどが最初の127 Unicodeセットにあり、すべて最初の255Unicodeにあります。この範囲外のゴミがたくさんあり、おそらくGUIでのフォーマットに使用されます。

基本的なUnicode(127または255)以外の値をスペースまたはタブに置き換えるSQLソリューションを探しています。replace()を使用しようとすると、基本的なUnicode文字しか認識されないように見えるため失敗しました。私の最善の解決策は、特定のUnicode範囲外のゴミのブロックを単一のタブに置き換えることです(そして、以下の既存の解決策と同じくらい簡単です)。

ゴミが残っている文字列に変換する解決策が1つあります。

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

私はAZaz0-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 に答える