2013-02-28 38 views
2

我有一個數據類型爲[IMAGE]的數據字段的SQL2008 R2數據庫,字段中的值實際上是代表大多數文本的各種格式的BLOB。二進制數據由HP的Service Manager創建,它們在內部用於填充GUI中的表和數組。我使用BIRT(4.2)基於Eclipse的報告工具來收集數據並創建報告。如何用空格或製表符替換非標準的Unicode使用SQL

儘管可以將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 

我有數據預覽的屏幕截圖,但名聲不足以將它張貼,它不通過複製和粘貼轉移阱。

我有另一種解決方案,我發現並提取了一塊,我需要(即IM00120)

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

我寫了剔除了比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 
+0

謝謝,這是我在SQL中使用函數的第一次嘗試那麼回事因爲我正在應用和定製它。 – 2013-02-28 14:49:36

+0

再次感謝,我已經啓動並運行在我的測試服務器上,並開始嘗試定製它來滿足我的需求。它似乎像廣告一樣工作。 – 2013-02-28 18:27:40

+0

@JamesJenkins很高興我能幫忙:) – twoleggedhorse 2013-03-01 08:34:46

相關問題