Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL Server中用一个单词替换列中的重复单词_Sql_Sql Server - Fatal编程技术网

如何在SQL Server中用一个单词替换列中的重复单词

如何在SQL Server中用一个单词替换列中的重复单词,sql,sql-server,Sql,Sql Server,我的数据库中有几百万个与文件路径相关的字符串; 由于第三方程序,这些路径已嵌套如下: C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\ 我想更新条目,使thirdparty\thirdparty\etc变成\thirdparty 我尝试过以下代码: UPDATE table SET Field = REPLACE(Field, 'tables\thirdpart

我的数据库中有几百万个与文件路径相关的字符串; 由于第三方程序,这些路径已嵌套如下:

C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\
我想更新条目,使
thirdparty\thirdparty\etc
变成
\thirdparty

我尝试过以下代码:

UPDATE table
SET Field = REPLACE(Field, 'tables\thirdparty\%thirdparty\%\', 'tables\thirdparty\')

你想要这样的东西吗

SELECT SUBSTRING('tables\thirdparty\%thirdparty\%\',0,CHARINDEX('\','tables\thirdparty\%thirdparty\%\',0)) + '\thirdparty\'


可以使用以下技术避免使用循环:

Update TABLE
SET Field = left(Field,charindex('*',replace(Field, 'thirdparty\', '*'))-1)+'thirdparty\'+right(Field,charindex('*',reverse(replace(Field, 'thirdparty\', '*')))-1)

现在已经太晚了,但我只是想,如果我想把一个单词替换成他想重复的同一个单词。这将用追加一次“\thirdparty”替换所有

看看这个

Declare @table table(Field varchar(max))
insert into @table values('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\')
,('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\1')
,('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\2')
,('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\3')
,('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\4')

UPDATE @table
SET Field = SUBSTRING (Field, 1, CHARINDEX('\thirdparty', Field ) ) +  'thirdparty\'
--replace (Field , 'thirdparty\' ,'')  
+ reverse( SUBSTRING ( REVERSE(Field), 1, CHARINDEX(reverse('\thirdparty'), REVERSE(Field) )-2 ) )
--REPLACE(Field, 'tables\thirdparty\%thirdparty\%\', 'tables\thirdparty\')

select * from @table

您可以发布您的试用代码吗?您可以向我们展示一些代码,让我们看看您的试用情况吗?您是想连续更换2个第三方还是任意数量的代码?您的目标是什么?您想更新现有字符串还是只处理SELECT查询?@TimBiegeleisen any numberDoes replace真的支持通配符吗?@a_horse_with_no_name-是的,它支持通配符。@Dansmith-我可以知道更新时出现了什么错误吗?嗯,顺便说一句,它应该可以工作。因为我已经在我当地的酒店试过了。使用您提供的字符串。@eftpotrm-我们不能没有while循环吗?@rajeshpanchal循环通常可以被基于集合的操作替换,但代价是更复杂的查询。如果循环将有大量的迭代,那么值得重写为基于集合的循环,以提高性能;在这种情况下,可能的迭代次数不足,性能会变得很糟糕,因此我会选择更简单、更易于编写和维护的代码。我想我会再次弹出并说声谢谢@eftpotrm您的代码再次拯救了我的培根。@eftpotrm您知道吗,这种情况再次发生,再次感谢。是的,这可能是解决方案,我也给出了同样的解决方案。位已更改,但几乎相同。是的,您的更新是可以的,但在“选择”中使用的通配符是错误的。我也试过了,见上图。
Update TABLE
SET Field = left(Field,charindex('*',replace(Field, 'thirdparty\', '*'))-1)+'thirdparty\'+right(Field,charindex('*',reverse(replace(Field, 'thirdparty\', '*')))-1)
Declare @table table(Field varchar(max))
insert into @table values('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\')
,('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\1')
,('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\2')
,('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\3')
,('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\4')

UPDATE @table
SET Field = SUBSTRING (Field, 1, CHARINDEX('\thirdparty', Field ) ) +  'thirdparty\'
--replace (Field , 'thirdparty\' ,'')  
+ reverse( SUBSTRING ( REVERSE(Field), 1, CHARINDEX(reverse('\thirdparty'), REVERSE(Field) )-2 ) )
--REPLACE(Field, 'tables\thirdparty\%thirdparty\%\', 'tables\thirdparty\')

select * from @table