SQL UDF works with a row and does not work in a column

I have a function to convert UTF8 characters. When I call a function using a string, it works as expected.

select dbo.fn_PolskieZnaki_utf8('Kraków')

returns Kraków

But when I select a column from the table, it does not work. He returns Kraków. What's wrong?

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

Here is the function itself:

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
+4
source share
2 answers

This may be due to a column mapping in your table.

Check out this sample request.

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

Conclusion:

Kraków  KrakA3w

Kraków  Kraków

EDIT In addition to the above, in your function when using REPLACEyou are missing Nbefore the search character 'Ä,,', N'Ą'). It should be like that N'Ä,,', N'Ą').

The updated function will look as follows.

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

N T-SQL?

+2

, . . 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
0

All Articles