【问题标题】:SQL UDF works on string and does not work on columnSQL UDF 适用于字符串,不适用于列
【发布时间】:2015-07-25 23:40:30
【问题描述】:

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

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

【问题讨论】:

  • 你的MyTable定义是什么?
  • @ughai 我只写 dbo.MyTableName

标签: sql sql-server-2008 replace


【解决方案1】:

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

【讨论】:

  • 我试过SQL_Polish_Cp1250_CI_ASPolish_CI_AS。它们都不起作用。
【解决方案2】:

最后这个功能对我有用。我已经改变了字符。 N 之前的字符是必需的。 collate 原来是不必要的。在 cmets 中,我用那些浓密的字符给了一些波兰城市。

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

【讨论】:

    猜你喜欢
    • 2017-01-06
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    相关资源
    最近更新 更多