SQL UDF适用于字符串,不适用于列

时间:2015-05-14 11:14:08

标签: sql sql-server-2008 replace

我有一个转换UTF8字符的功能。当我使用字符串调用函数时,它按预期工作。

function aFunction(){ /*something*/}
measureTimeExecution("div",aFunction);

返回select dbo.fn_PolskieZnaki_utf8('Kraków')

但是当我从表中选择一列时,它不起作用。它返回Kraków。有什么问题?

Kraków

这是函数本身:

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

2 个答案:

答案 0 :(得分: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?

答案 1 :(得分: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