T-SQL 查询用特定字符替换特殊字符

T-SQL query to replace special characters with a specific character

我正在使用 SQL Server 2014 并且我有以下 T-SQL 查询:

select p9.[Name]
from [CleanGuestNames] p outer apply
     (select replace(p.[Name], '@', '*') as [Name]) p1 outer apply
     (select replace(p1.[Name], '&', '*') as [Name]) p2 outer apply
     (select replace(p1.[Name], '\', '*') as [Name]) p3 outer apply
     (select replace(p1.[Name], '?', '*') as [Name]) p4 outer apply
     (select replace(p1.[Name], '/', '*') as [Name]) p5 outer apply
     (select replace(p1.[Name], ':', '*') as [Name]) p6 outer apply
     (select replace(p1.[Name], ';', '*') as [Name]) p7 outer apply
     (select replace(p1.[Name], '.', '*') as [Name]) p8 outer apply
     (select replace(p2.[Name], ',', '*') as [Name]) p9 ;

上面的代码应该用 [Name] 列中的 * 替换其中提到的所有字符。

当我运行查询时,我仍然从[Name]列中得到如下记录:

Alex / Sandrine SINNOF / VAN ACK
Peter / Jane KELLY

预期结果:

Alex * Sandrine SINNOF * VAN ACK
Peter * Jane KELLY

我做错了什么?

如评论中所述,这确实是一个印刷错误,因为您一直在引用 p1.[name],所以您最终只删除了字符 @&,以及 ,。您需要引用 p2.[name]p3.[name] 等:

select p9.[Name]
from dbo.[CleanGuestNames] p outer apply
     (select replace(p.[Name], '@', '*') as [Name]) p1 outer apply
     (select replace(p1.[Name], '&', '*') as [Name]) p2 outer apply
     (select replace(p2.[Name], '\', '*') as [Name]) p3 outer apply
     (select replace(p3.[Name], '?', '*') as [Name]) p4 outer apply
     (select replace(p4.[Name], '/', '*') as [Name]) p5 outer apply
     (select replace(p5.[Name], ':', '*') as [Name]) p6 outer apply
     (select replace(p6.[Name], ';', '*') as [Name]) p7 outer apply
     (select replace(p7.[Name], '.', '*') as [Name]) p8 outer apply
     (select replace(p8.[Name], ',', '*') as [Name]) p9;

不过,就我个人而言,我建议嵌套所有 REPLACE 函数:

SELECT R.[Name]
FROM dbo.CleanGuestNames CGN
     CROSS APPLY (VALUES(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(p.[name],'@',''),'&',''),'\',''),'?',''),'/',''),':',''),';',''),'.',''),',','')))R([Name]);

如果您使用的是受支持的 SQL 服务器版本,您可以使用 TRANSLATE:

使其更加简洁
SELECT T.[Name]
FROM dbo.CleanGuestNames CGN
     CROSS APPLY (VALUES(REPLACE(TRANSLATE(p.[name],'@&\?.:;.',',,,,,,,,'),',','')))T([Name]);