2015-05-14 84 views
4

我有一個用於轉換UTF8字符的函數。當我使用字符串調用函數時,它按預期工作。SQL UDF在字符串上工作,在列上不起作用

select dbo.fn_PolskieZnaki_utf8('Kraków') 

回報Kraków

但是,當我從表中選擇一列這是行不通的。它返回Kraków。哪裏不對?

use MyDataBase 
GO 
select dbo.fn_PolskieZnaki_utf8(MyColumn) 
from MyTable 

下面是函數本身:

CREATE FUNCTION [dbo].[fn_PolskieZnaki_utf8](@string NVARCHAR(MAX)) 
RETURNS NVARCHAR(MAX) 
AS 
begin 
    RETURN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE 
       (REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE 
    (@string, 
'Ä,,', N'Ą'), 
'Ä...', N'ą'), 
'Ć', N'Ć'), 
'ć', N'ć'), 
'Ę', N'Ę'), 
'Ä™', N'ę'), 
'Å', N'Ł'), 
'Å,', N'ł'), 
'Ń', N'Ń'), 
'Å„', N'ń'), 
'Ã"', N'Ó'), 
'ó', N'ó'), 
'Åš', N'Ś'), 
'Å›', N'ś'), 
'Ź', N'Ź'), 
'Å°', N'ź'), 
'Å»', N'Ż'), 
'ż', N'ż') 
end 
+0

這適用於我 –

+0

什麼是您的MyTable定義? – ughai

+0

@ughai我只是寫dbo.MyTableName –

回答

2

這可能是你的表中的列,因爲collation

選中此示例查詢。

DECLARE @table table(c varchar(50) collate SQL_Polish_Cp1250_CI_AS) 
insert into @table values(N'Kraków') 

DECLARE @table2 table(c varchar(50) collate SQL_Latin1_General_Cp1_CS_AS) 
insert into @table2 values(N'Kraków') 

select dbo.fn_PolskieZnaki_utf8('Kraków'),dbo.fn_PolskieZnaki_utf8(c) from @table 
select dbo.fn_PolskieZnaki_utf8('Kraków'),dbo.fn_PolskieZnaki_utf8(c) from @table2 

輸出:

Kraków KrakA3w 

Kraków Kraków 

編輯使用REPLACE 除了上述之外,在你的函數你缺少N檢索文字'Ä,,', N'Ą')之前。它應該是這樣的N'Ä,,', N'Ą')

更新的功能將如下所示。

ALTER FUNCTION [dbo].[fn_PolskieZnaki_utf8](@string NVARCHAR(MAX)) 
RETURNS NVARCHAR(MAX) 
AS 
begin 
    RETURN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE 
       (REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE 
    (@string, 
N'Ä,,', N'Ą'), 
N'Ä...', N'ą'), 
N'Ć', N'Ć'), 
N'ć', N'ć'), 
N'Ę', N'Ę'), 
N'Ä™', N'ę'), 
N'Å', N'Ł'), 
N'Å,', N'ł'), 
N'Ń', N'Ń'), 
N'Å„', N'ń'), 
N'Ã"', N'Ó'), 
N'ó', N'ó'), 
N'Åš', N'Ś'), 
N'Å›', N'ś'), 
N'Ź', N'Ź'), 
N'Å°', N'ź'), 
N'Å»', N'Ż'), 
N'ż', N'ż') 
end 

其他鏈接:

COLLATE

Find Collation of Database and Table

What is the meaning of the prefix N in T-SQL statements?

+0

我已經嘗試過'SQL_Polish_Cp1250_CI_AS'和'Polish_CI_AS'。它們都不起作用。 –

+0

請檢查更新的答案 – ughai

0

最後此功能爲我工作。我改變了角色。 N之前的人物是必要的。 collate原來並不是必需的。在評論中,我給一些波蘭城市使用那些濃密的字符。

CREATE FUNCTION [dbo].[fn_PolskieZnaki_UTF8](@string NVARCHAR(MAX)) 
RETURNS NVARCHAR(MAX) 
AS 
begin 
    RETURN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE 
       (REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE 
    (@string, 
N'Ä„', N'Ą'), --RUDA ŚLÄ„SKA 
N'Ä…', N'ą'), --ŚlÄ…skie 
N'Ć', N'Ć'), --ZAMOŚĆ 
N'ć', N'ć'), --Zamość 
N'Ä', N'Ę'), --ŁÄCZNA 
N'Ę™', N'ę'), --Ostrowiec ŚwiĘ™tokrzyski 
N'Ĺ', N'Ł'), --BIAĹA PODLASKA 
N'Ĺ‚', N'ł'), --MirosĹ‚awiec 
N'Ĺ', N'Ń'), --POZNAĹ 
N'Ĺ„', N'ń'), --PoznaĹ„ 
N'Ă「', N'Ó'), --PIWNICZNA-ZDRĂ「J 
N'Ăł', N'ó'), --Piwniczna-ZdrĂłj 
N'Ĺš', N'Ś'), --ĹšlÄ…skie 
N'Ĺ›', N'ś'), --DolnoĹ›ląskie 
N'Ĺą', N'Ź'), --CZELADĹą 
N'Ĺş', N'ź'), --ŁódĹş 
N'Ĺ»', N'Ż'), --CHODZIEĹ» 
N'ĹĽ', N'ż') --ŁomĹĽa 
end 
相關問題