【问题标题】:How to replace an umlaut inside a T-SQL function如何替换 T-SQL 函数中的变音符号
【发布时间】:2016-10-09 20:48:28
【问题描述】:

我需要替换我在 T-SQL 中定义的函数中的变音符号。

我的代码如下所示:

CREATE FUNCTION [dbo].[my_function](@s varchar(4000))
RETURNS varchar(4000)
AS
BEGIN
    SET @s = UPPER(@s)
    SET @s = REPLACE(@s, 'Ä', 'AE')

    RETURN @s
END

当我输入äpfel 时,我得到AEPFEL,这是我的预期结果,

但是当我输入apfel 时,我也会得到AEPFEL,这是不应该发生的。

我很确定这是一个区分重音排序规则的问题,但我不知道如何将它与替换功能一起使用。

感谢任何输入!

【问题讨论】:

    标签: sql-server tsql collation


    【解决方案1】:

    您可以为每个字符串表达式显式指定排序规则:

    set @s = replace(@s COLLATE Latin1_General_BIN, 'Ä', 'AE')
    

    在此之后REPLACE 将考虑重音。请注意,您不能将COLLATE 放在参数或返回值上,很遗憾,这将是一个更明显的解决方案。

    【讨论】:

    • 谢谢!是的,我尝试将排序规则放在参数上,认为这将是一种明显的处理方式,但这当然不起作用......
    • DECLARE @s as varchar(4000) COLLATE Latin1_General_BIN。没有帮助。您必须明确地将排序规则放在替换函数体中。
    【解决方案2】:

    除了 Jeroen Mostert 的回答之外,如果您需要区分大小写的解决方案,请尝试此代码。 注意使用的排序规则中的 CS = "Case Sensitive"。

    如果您需要处理 unicode 字符,您还应该考虑使用 NVARCHAR 值。

    CREATE FUNCTION [dbo].[my_function](@s varchar(4000))
    RETURNS varchar(4000)
    
    AS
    BEGIN
    SET @s =    REPLACE(
                REPLACE(
                REPLACE(
                REPLACE(
                REPLACE(
                REPLACE(
                REPLACE(@s COLLATE Latin1_General_CS_AS
                , 'Ä', 'AE')
                , 'Ö', 'OE')
                , 'Ü', 'UE')
                , 'ä', 'ae')
                , 'ö', 'oe')
                , 'ü', 'ue')
                , 'ß', 'ss') 
    
       RETURN @s
    
    END
    
    SELECT dbo.my_function('AOUSS_aeouss_ÄäÖöÜüß')
    -- Result is AOUSS_aeouss_AEaeOEoeUEuess
    

    【讨论】:

      猜你喜欢
      • 2013-12-23
      • 2021-09-02
      • 2010-10-26
      • 2012-07-24
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      相关资源
      最近更新 更多