2016-06-09 4 views
1

Мне нужно заменить umlauts на функцию, определенную в T-SQL.Как заменить умляут внутри функции 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, который не предполагается бывает.

Я уверен, что это вопрос чувствительной к акценту сортировки, но я не знаю, как использовать это с функцией замены.

Любой ввод оценивается!

ответ

3

Вы можете задать параметры сортировки явно в строковое выражение:

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

И после этого REPLACE будет принимать во внимание акценты. Обратите внимание, что вы не можете поставить COLLATE на параметр или возвращаемое значение, к сожалению, это было бы более очевидным решением.

+0

Спасибо! Да, я попробовал поставить сопоставление по параметру, думая, что это будет очевидный способ справиться с этим, но это не сработало, конечно ... – sandbo00

0

В дополнение к ответу Джереена Мостерта попробуйте этот код, если вам нужно решение, чувствительное к регистру. Обратите внимание на CS = «Case Sensitive» в используемой сортировке.

Если вам нужно обрабатывать символы юникода, вам также следует рассмотреть использование значений 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