我試圖通過用 '\\' 替換單個 '\' 來逃避一些反斜杠:
UPDATE Table
SET Column = REPLACE(Column , '\', '\\')
但是我只想在反斜杠不是另一個反斜杠的先例時才進行替換,因此輸入test\應該替換為test\\但test\\應該保留test\\
編輯:如果存在兩個以上的反斜杠,則不應替換。
uj5u.com熱心網友回復:
T-SQL 不支持模式替換,因此您需要在REPLACE此處使用一些嵌套的s;第一個將雙斜線 ( \\)替換為未出現在您的資料中的內容(我使用管道 ( |)),第二個替換單斜線,然后最后一個將管道替換回雙斜線。
UPDATE dbo.[Table]
SET [Column] = REPLACE(REPLACE(REPLACE([Column], '\\', '|'),'\','\\'),'|','\\');
如果您有這樣的值,'test\\\'則最終將作為'test\\\\',因為前 2 個\字符不會被替換,但后者會。
由于我是懲罰的“面筋”,如果您確實需要避免上述情況'\\\'被替換為'\\\\' 并且(因為您沒有提到)可能在您的值中有多個單斜杠實體,您將不得不執行類似的操作這個。
CREATE TABLE dbo.[Table] (ID int IDENTITY, --As I assume you have some kind of ID column
[Column] varchar(100));
GO
INSERT INTO dbo.[Table] ([Column])
VALUES ('test\'),
('sample\\'),
('example\\\'),
('Another\example'),
('A\harder\\example\'),
('A\far\\more\complex\\example\\\than\is\\needed\');
GO
SELECT *
FROM dbo.[Table];
GO
WITH rCTE AS(
SELECT T.ID,
T.[Column],
PI.I,
STUFF(T.[Column],PI.I 1,0,'\') AS NewColumn,
1 AS Iteration
FROM dbo.[Table] T
CROSS APPLY (VALUES(PATINDEX('%[^\]\[^\]%',[Column])))PI(I)
UNION ALL
SELECT r.ID,
r.[Column],
PI.I,
LEFT(r.NewColumn,r.I 1) STUFF(S.StuffColumn,PI.I 1,0,'\') AS NewColumn,
r.Iteration 1 AS Iteration
FROM rCTE r
CROSS APPLY (VALUES(STUFF(r.NewColumn,1,r.I 1,'')))S(StuffColumn)
CROSS APPLY (VALUES(PATINDEX('%[^\]\[^\]%',StuffColumn)))PI(I)
WHERE PI.I > 0)
UPDATE T
SET [Column] = CASE WHEN r.NewColumn LIKE '%[^\]\' THEN r.NewColumn '\' ELSE r.NewColumn END
FROM dbo.[table] T
CROSS APPLY (SELECT TOP (1)
CASE WHEN r.NewColumn LIKE '%[^\]\' THEN r.NewColumn '\' ELSE r.NewColumn END AS NewColumn
FROM rCTE r
WHERE r.ID = T.ID
ORDER BY r.Iteration DESC) r;
GO
SELECT *
FROM dbo.[Table];
在這里,我們必須使用遞回 CTE 來遍歷該值,每次它找到一個\沒有其他斜線相鄰的斜線 ( ) 時,它就會將另一個斜線注入字串中。然后,由于這在字串的末尾不起作用,您需要使用CASE運算式在末尾添加額外的斜杠值。您還需要在開始時執行此操作(但我尚未在此處執行此操作)。
資料庫<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336017.html
