2009-08-05 69 views
3

我需要將值「Convert value to a URL友好格式 - Unicode分解ähhh」轉換爲「convert-value-into-a-url-friendly-format-unicode -decomposition-唉唉」。 這是可能的SQL服務器? 所有Unicode - 字符都應該被處理。將值轉換爲友好的URL格式 - Unicode分解ähhh

我使用SQL-Server 2005,2008作爲選項。

編輯

波格丹有一個解決方案,爲我工作。

該查詢取決於你需要處理的字符,但在大多數情況下,它應該是確定的。你真的需要傳遞一個排序規則,不是有你需要改變的字符。西里爾很好。這是種哈克...

申報@input爲nvarchar(4000) 組@input = 'áâãäåæçèéêëìíîïðñòóôõöùúûüýÿāăąćĉċčĕėęěĝğġģĥħĩīĭįĵķļľńňŋōŏőŕřśŝşšťũūŭůűŵŷźžǻǽǿ'

SELECT CAST(@input爲char(4000))COLLATE Cyrillic_General_CI_A小號

+0

「所有的Unicode - 字符應該處理」,這是相當多 – 2009-08-05 14:01:40

+0

確實如此。我可以限制範圍,因爲我猜我不需要ƺ或ƻ,甚至不需要Ƕ。但我猜這個問題並沒有真正改變;-) – 2009-08-05 15:24:01

回答

4

下面是一個簡單的URL編碼功能(它使用VARCHAR作爲參數),我發現很久以前就一些論壇

create function urlencode(@str as varchar(4000)) 
returns varchar(4000) 
as 
begin 
declare @hex char(16) 
declare @c char(1) 
set @hex='ABCDEF' 
declare @ostr varchar(4000) 
set @ostr='' 
declare @l int 
set @l = 1 
while @l <= len(@str) 
begin 
set @c = substring(@str,@l,1) 
if @c between '0' and '9' 
or @c between 'A' and 'Z' 
or @c between 'a' and 'z' 
    set @ostr = @ostr + @c 
    else 
    set @ostr = @ostr + '%' + 
    substring(@hex,(ascii(@c)/16)+1,1) 
    +substring(@hex,(ascii(@c)&15)+1,1) 
set @[email protected]+1 
end 
return @ostr 
end 
go 

你將如何處理unicode?那麼,如果你不關心印度或阿拉伯符號,而是關心中歐語言,那麼這很簡單。正是你需要的是使用CAST(@nvarchar as varchar)函數。

讓我們來看看它如何與一些中歐標誌一起工作。運行在

declare @t1 nvarchar(256) 
select @t1 = N'áâãäåæçèéêëìíîïðñòóôõöùúûüýÿāăąćĉċčĕėęěĝğġģĥħĩīĭįĵķļľńňŋōŏőŕřśŝşšťũūŭůűŵŷźžǻǽǿ' 
select @t1 
declare @t2 varchar(512) 
select @t2 = cast(@t1 as varchar(512)) 
select @t2 

下面的例子,看看輸出,我們將得到

áâãäåæçèéêëìíîïðñòóôõöùúûüýÿāăąćĉċčĕėęěĝğġģĥħĩīĭįĵķļľńňŋōŏőŕřśŝşšťũūŭůűŵŷźžǻǽǿ 
aaaaa?ceeeeiiii?nooooouuuuyyaaacccceeeegggghhiiiijkllnn?ooorrsssstuuuuuwyzz??? 

所以,大多數符號完美轉換,而幾個符號將是問號。如果你關心這樣的符號(比如æ,ð,ŋ),你需要編寫一個額外的函數,在轉換之前將它們替換爲你最適合它們的東西(有時是2個符號而不是1個,例如æ= > ae)。

要取代你可以使用REPLACE()函數,但你應該明白,如果你多次調用它,性能將受到影響。所以如果你有很多字符替換,你可以使用下面的算法

1)創建一個包含3列的臨時表(或表類型變量) - position int identity(0,1)primary key clustered,original nchar( 1)使用循環和SUBSTRING()函數將字符串拆分爲字符並將每個字符插入原始該臨時表的列 3)使用一個查詢與許多WHEN THEN語句進行轉換所有符號

update @temp_table 
set converted = CASE original 
    WHEN N'æ' THEN 'ae' 
    WHEN N'ŋ' THEN 'n' 
    ... and so on ... 
    ELSE CAST(original AS VARCHAR(2)) 

4)使用循環,連接結果,您在c反轉列變成一個varchar()變量。

將nvarchar()轉換爲varchar()時,請調用上面列出的urlencode()函數。

我知道這種情況下需要很多時間/時間,但這取決於您當前的語言。正如你所看到的,對於大多數歐洲符號CAST到varchar可以給出完美的結果。

如果您將使用CLR函數實現(在C#上),您將不得不編寫大量的switch/case語句。因此,比較兩種方法都需要開發相同的工作,但CLR解決方案需要額外的管理措施。對於小字符串CLR解決方案將工作緩慢(因爲SQL服務器需要一些時間來與CLR環境進行交互以進行呼叫,然後獲得結果),而對於有大量替換的大字符串,C#也許(從未檢查過!)可以速度更快,因爲SQL不是字符串操作的最佳語言。

0

是的,這是可能的。答案是'標量值用戶定義函數'(UDF)。

在這裏我看到兩個選項:

  1. 創建T-SQL中的UDF - 需要相當多的努力,很多與字符代碼[我quess]工作,將「不會那麼快」 。
  2. 創建一個CLR UDF - 在熟悉.NET的情況下,更快更簡單。

第二個選項將要求您允許在SQL Server CLR集成除了與功能創建的組件,並將其部署到服務器(S):

版EXEC sp_configure CLR啓用',1
RECONFIGURE