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

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

select dbo.fn_PolskieZnaki_utf8('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

最佳答案 这可能是因为您表中列的
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?

点赞