繁体   English   中英

SQL在更新查询的列数据中间添加

[英]SQL append in middle of column data in update query

进行数据刷新时,我们需要在\\\\prod01\\\\Test\\Load服务器名称后附加\\\\prod01.qa.com\\\\Test\\Load

我该如何编写更新查询。 我可能需要做的服务器名称可能不同,就是编写更新脚本以将服务器名称附加到qa.com。

这是我的查询,提供了所有具有服务器位置的结果。

select * from AppSetting where Value like '%\\\\%\\%' or Value like '%//%/%';

我的Prod数据如下所示

Value
\\prod01\Images\Load
\\prod01prod6253\Images\Load
\\server05ser\Images\Delete
\\pgdg1076\Email
\\pgdg1076ythg\Test\Load
http://prod7/delta/

更新查询后,我的质量检查数据应如下所示

Value
\\prod01.qa.com\Images\Load
\\prod01prod6253.qa.com\Images\Load
\\server05ser.qa.com\Images\Delete
\\pgdg1076.qa.com\Email
\\pgdg1076ythg.qa.com\Test\Load
http://prod7.qa.com/delta/

这是我的更新查询。 我可以写一个通用查询吗

UPDATE eroom.AppSetting
SET Location = REPLACE(Location, '\\prod01\', '\\prod01.qa.tbc.com\') 
WHERE Location like '%\\prod01\%';
UPDATE eroom.AppSetting
SET Location = REPLACE(Location, '\\server05ser\', '\\server05ser.qa.tbc.com\') 
WHERE Location like '%\\server05ser\%';

我将其发布为新答案,因为OP大量移动了目标帖子。 相反,我现在使用CHARINDEX查找每个斜杠的位置(正向或反向)。 幸运的是,注入需要在第三个斜杠之前进行,因此我们可以利用它来取得优势:

SELECT STUFF(V.Value,CI3.I,0,'.qa.tbc.com') AS NewValue,*
FROM (VALUES('\\prod01\Images\Load'),
            ('\\prod01prod6253\Images\Load'),
            ('\\server05ser\Images\Delete'),
            ('\\pgdg1076\Email'),
            ('\\pgdg1076ythg\Test\Load'),
            ('http://prod7/delta/'))V([value])
     CROSS APPLY (VALUES(CASE WHEN V.[value] LIKE '%/%' THEN '/' ELSE '\' END)) L(C) --So I don't have to keep checking what character I need
     CROSS APPLY (VALUES(CHARINDEX(L.C,V.[value]))) CI1(I)
     CROSS APPLY (VALUES(CHARINDEX(L.C,V.[value],CI1.I+1))) CI2(I)
     CROSS APPLY (VALUES(CHARINDEX(L.C,V.[value],CI2.I+1))) CI3(I);

这是一种方法。 我将PATINDEXCHARINDEX的表达式放在FROM ,因为我发现它更容易阅读,并且意味着更少的重复:

SELECT V.[value],
       ISNULL(STUFF(V.Value,ISNULL(CI.fs,CI.bs),0,'.qa.tbc.com'),V.[value]) AS NewValue
FROM (VALUES('\\prod01\Images\Load'),
            ('\\prod05\Images\Delete'),
            ('\\prod10\Email'),
            ('//http://prod7/delta/'))V([value])
     CROSS APPLY (VALUES(NULLIF(PATINDEX('%prod[0-9]%',V.value),0)))PI(I)
     CROSS APPLY (VALUES(NULLIF(CHARINDEX('/',V.[value],PI.I),0),NULLIF(CHARINDEX('\',V.[value],PI.I),0))) CI(fs,bs);

这回答了问题的原始版本。

最简单的方法可能是使用stuff()和一个case表达式:

select (case when location like '\\prod[0-9][0-9]\*'
             then stuff(location, 9, 0, '.qa.tbc.com'
             else location
        end)

“ prod”部分看起来是固定长度,因此您无需搜索模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM