我试图替换我坚持使用的分隔列表中的值,我知道它违反了规范化。但是我别无选择。我编写了一个查询来替换分隔列表中的值,并避免重复,如果我试图替换它的值已经存在。
我的查询在SQL Server 2017中运行得很好,但它在SQL Server 2014中不起作用。我收到一条错误消息。我需要此查询在SQL Server 2014中工作。我会非常感激。下面给出了我的查询以及小提琴执行链接。错误消息是
Msg 156 Level 15 State 1 Line 4 关键字“FROM”附近的语法不正确。
Msg 102 Level 15 State 1 Line 14 “输入”附近的语法不正确。
Msg 102 Level 15 State 1 Line 23 'replacement'附近的语法不正确。
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 + '%'
TRIM()
function是Sql Server 2017的新版本。对于旧版本的Sql Server,您必须使用较旧的LTRIM()
和RTRIM()
函数,这些函数不具有相同的characters FROM string
语法,或其他更复杂的字符串函数,如CHARINDEX()
和SUBSTRING()
。
最简单的事情可能是REPLACE()
所有具有特殊字符的空间,你知道它不是你的数据的一部分,然后REPLACE()
所有逗号都有空格,使用旧的LTRIM()
/ RTRIM()
函数修剪空格,REPLACE()
空格再回到逗号,和REPLACE()
特殊的角色回到空间。
REPLACE(REPLACE(RTRIM(LTRIM(REPLACE(REPLACE(column, ' ', '|'), ',', ' '))), ' ', ','), '|', ' ')
或者如果您知道可能只有一个额外的尾随或前导逗号,您可以测试它并使用SUBSTRING()来剪切该字符。