sql - SQL - 替换列字符串值的特定部分(在第二个和第三个斜杠之间)
问题描述
在我的SQLServer DB 中,我有一个名为Documents的表,其中包含以下列:
- 身份证 - INT
- DocLocation - NTEXT
DocLocation具有以下格式的值: '\\fileShare1234\storage\ab\xyz.ext'
现在看来,这些文档存储在多个文件共享路径中。我们计划将所有文档迁移到一个名为“newFileShare”的单一文件共享路径中,同时保持内部文件夹结构。
所以基本上 '\\fileShare1234\storage\ab\xyz.ext'应该更新为'\\newFileShare\storage\ab\xyz.ext'
两个问题:
- 如何查询我的 DocLocation 以提取具有唯一文件共享值的 DocLocation?像'fileShare1234'和'fileShare6789'等等..
- 在单个更新查询中,如何将我的 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\')
解决方案
第一步相当容易。如果您的所有路径都以 . 开头\\
,那么您可以找到所有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
推荐阅读
- javascript - What is the proper way to declare a javascript standalone library that works in nodejs, browser, commonJS, and AMD?
- flutter - how to make video_player prepare and start to play quicklier?
- bash - 如何通过管道从查找到解压缩到 grep
- angular - Angular Draggable,工具提示和点击
- c# - 非根对象的 JSON 反序列化
- php - 使用 codeigniter 从数据库中检索数据时出错
- actions-on-google - 如何在 Google 上的操作中强制注销关联帐户?
- excel - 自动保存将文件名保存为“真”或“假”
- django - Django 在没有模型的情况下从 CBV 发送电子邮件
- blockchain - Hyperledger 是像以太坊一样真正安全的区块链吗?