首页 > 解决方案 > SQL - 替换列字符串值的特定部分(在第二个和第三个斜杠之间)

问题描述

在我的SQLServer DB 中,我有一个名为Documents的表,其中包含以下列:

  1. 身份证 - INT
  2. DocLocation - NTEXT

DocLocation具有以下格式的值: '\\fileShare1234\storage\ab\xyz.ext'

现在看来,这些文档存储在多个文件共享路径中。我们计划将所有文档迁移到一个名为“newFileShare”的单一文件共享路径中,同时保持内部文件夹结构。

所以基本上 '\\fileShare1234\storage\ab\xyz.ext'应该更新为'\\newFileShare\storage\ab\xyz.ext'

两个问题:

  1. 如何查询我的 DocLocation 以提取具有唯一文件共享值的 DocLocation?像'fileShare1234'和'fileShare6789'等等..
  2. 在单个更新查询中,如何将我的 DocLocation 值更新为newFileShare'\\fileShare1234\storage\ab\xyz.ext''\\newFileShare\storage\ab\xyz.ext'

我认为诀窍是提取和替换第二个和第三个斜杠之间的文本。

我还没有弄清楚如何实现我的第一个目标。我需要这些独特的文件共享来完成其他一些任务。

至于第二个目标,我尝试在它之间使用 replace 将需要多个更新语句。就像我做的如下:

update Documents  set DocLocation = REPLACE(Cast(DocLocation as NVarchar(Max)), '\\fileShare1234\', '\\newFileShare\')

标签: sqlsql-server

解决方案


第一步相当容易。如果您的所有路径都以 . 开头\\,那么您可以找到所有DISTINCT使用SUBSTRING. 我将制作一个带有表变量的简单脚本来复制一些数据。3 的值在查询中,它是\\加 1 的长度,因为 SQL Server 从 1 开始计数。

DECLARE @Documents AS TABLE(
    ID INT NOT NULL, 
    DocLocation NTEXT NOT NULL
);

INSERT INTO @Documents(ID, DocLocation) 
VALUES (1,'\\fileShare56789\storage\ab\xyz.ext'),
(2,'\\fileShare1234\storage\ab\cd\xyz.ext'), 
(3,'\\share4567890\w\x\y\z\file.ext');

SELECT DISTINCT SUBSTRING(DocLocation, 3, CHARINDEX('\', DocLocation, 3) - 3) AS [Server] 
FROM @Documents;

结果是:

服务器
文件共享1234
文件共享56789
分享4567890

对于第二部分,我们可以将新的服务器名称与第一个之后出现的路径连接起来\

UPDATE @Documents 
SET DocLocation = CONCAT('\\newfileshare\',
    SUBSTRING(DocLocation, 3, LEN(CAST(DocLocation AS nvarchar(max))) - 2));

SELECT * FROM @Documents;

由于某种原因,我无法在此处创建包含结果的表,但我看到的值是:

\\newfileshare\fileShare56789\storage\ab\xyz.ext
\\newfileshare\fileShare1234\storage\ab\cd\xyz.ext
\\newfileshare\share4567890\w\x\y\z\file.ext

推荐阅读