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

更新查询中列数据中间的SQL追加,sql,sql-server,database,Sql,Sql Server,Database,在执行数据刷新时,我们需要将\\prod01\\Test\Load服务器名称附加到\\prod01.qa.com\\Test\Load 如何为此编写更新查询。可以有不同的服务器名称,我只需要编写更新脚本,将服务器名称附加到qa.com 这是我的查询,它给出了所有具有服务器位置的结果 从AppSetting中选择*,其中的值为“\\%\%”或值为“%//%/%” 我的Prod数据如下所示 Value \\prod01\Images\Load \\prod01prod6253\Images\Load

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

如何为此编写更新查询。可以有不同的服务器名称,我只需要编写更新脚本,将服务器名称附加到qa.com

这是我的查询,它给出了所有具有服务器位置的结果

从AppSetting中选择*,其中的值为“\\%\%”或值为“%//%/%”

我的Prod数据如下所示

Value
\\prod01\Images\Load
\\prod01prod6253\Images\Load
\\server05ser\Images\Delete
\\pgdg1076\Email
\\pgdg1076ythg\Test\Load
http://prod7/delta/
更新查询后,我的QA数据应该如下所示

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\%';

这是一种方法。我将PATINDEX和CHARINDEX的表达式放在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部分看起来是固定长度的,因此您不需要搜索模式。

我将此作为一个新的答案发布,因为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);

您可以查看STUFF函数。嗯,您最近的编辑显著地移动了目标帖子。我不小心在http之前添加了//对不起。如果\\THIS\u is-SERVER\之间有一个值,我们可以将其视为服务器名称。prod不是可靠的后缀,它可以是prod1或server1或其他任何名称。它只能有这种模式“%\\%\%”我不使用“prod”@Luci我使用的是“prod[0-9]”,你说的服务器1是什么意思?如果您有其他场景,为什么不在问题中包括这些场景。太好了,此选择查询有效。我如何将其放入更新查询中?选择STUFFV.Value,CI3.I,0,“.qa.tbc.com”作为新值,*从eroom.AppSetting中选择SettingValue,其中SettingValue类似于“%\\%\%”或SettingValue类似于“%/%/%V[Value]交叉应用值当V.[value]如“%/%”时,然后“/”ELSE'\'结束LC交叉应用值scharindexl.C,V.[value]CI1I交叉应用值scharindexl.C,V.[value],CI1.I+1 CI2I交叉应用值scharindexl.C,V.[value],CI2.I+1 CI3I;更新YT SET YourColumn=STUFF。。。从您的表格中,请交叉应用@露西和其他任何更新声明一样。谢谢:-你救了我一天:-@Larnu。OP在我回答后改变了问题,我认为这是相当粗鲁的。我的评论是在他们改变它之前@GordonLinoff看到我的第一个答案与他们的原始样本数据。我也很沮丧,他们后来改变了很多球场。
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);