Мой запрос работает в SQL Server 2017, но не работает в SQL Server 2014 - PullRequest
0 голосов
/ 13 декабря 2018

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

Мой запрос отлично работает в SQL Server 2017, но не работает в SQL Server 2014. Я получаю сообщение об ошибке.Мне нужен этот запрос для работы в SQL Server 2014. Я был бы очень признателен.Мой запрос приведен ниже вместе со ссылкой на выполнение скрипки.Сообщение об ошибке:

Сообщение 156 Уровень 15 Состояние 1 Строка 4
Неверный синтаксис рядом с ключевым словом «ОТ».

Сообщение 102 Уровень 15 Состояние 1 Строка 14
Неверный синтаксис рядом с «входами».

Msg 102 Уровень 15 Состояние 1 Строка 23
Неверный синтаксис рядом с 'замена'.

https://dbfiddle.uk/rdbms=sqlserver_2014&fiddle=9eb71e1e90b07c8c150004dc9a6d5107

UPDATE test
SET appValue = TRIM(',' FROM REPLACE(inputs.expression, inputs.pattern, replacement.value))
FROM test
CROSS APPLY
    (SELECT
         ',' + appValue + ','  AS expression,
         ',' + '406'    + ','  AS pattern,
         ',' + '506'    + ','  AS replacement
    ) inputs
CROSS APPLY
    (SELECT
         CASE 
            WHEN inputs.expression LIKE '%' + inputs.replacement + '%'
               THEN ','
               ELSE inputs.replacement
         END) replacement(value)
WHERE
    inputs.expression LIKE '%' + inputs.pattern + '%'

1 Ответ

0 голосов
/ 13 декабря 2018

Функция TRIM() является новой для Sql Server 2017. Для более старых версий Sql Server необходимо использовать более старые функции LTRIM() и RTRIM(), которые не имеют одинаковых *Синтаксис 1006 * или другие более сложные строковые функции, такие как CHARINDEX() и SUBSTRING().

Здесь проще всего будет REPLACE() все пробелы со специальным знаком, который, как вы знаете, не является частью ваших данных,затем REPLACE() все запятые с пробелом, обрезать пробелы с помощью старых функций LTRIM() / RTRIM(), REPLACE() пробелы снова до запятых и REPLACE() специальный символ обратно до пробелов.

REPLACE(REPLACE(RTRIM(LTRIM(REPLACE(REPLACE(column, ' ', '|'), ',', ' '))), ' ', ','), '|', ' ')

Или, если вы знаете, что, скорее всего, будет только одна дополнительная конечная или начальная запятая, вы можете проверить это и использовать SUBSTRING (), чтобы вырезать только этот символ.

...