从SQL Server varchar列中删除奇怪的字符(带帽的A)

一些奇怪的字符被存储在表中的一个。 他们似乎来自.csv饲料,所以我没有太多的控制。

 Hello Kitty Essential Accessory Kit 

我如何清理它并删除这些字符。 我很好,在数据库级别或在C#中。

编辑

根据评论中收到的build议。 我也在考虑我能做些什么来纠正饲料水平。 这里有更多的信息。

  1. Feed来自第三方。
  2. 我打开记事本+ +饲料,并检查编码菜单,我看到在“在ANSI编码”前的点,所以我相信这是文件的编码
  3. 这就是它出现在记事本++“Hello Kitty基本配件套件”
  4. 一个奇怪的事情,但。 当我从csv文件searchpowershel中的行。 它出现在这一行。 我没有看到那些怪异的angular色

您可以使用.net正则expression式函数。 例如,使用Regex.Replace

 Regex.Replace(s, @"[^\u0000-\u007F]", string.Empty); 

由于在SQL Server不支持正则expression式,所以需要创build一个SQL CLR函数。 有关.net集成SQL Server更多信息可以在这里find:

  • string工具函数示例 – 完整的工作示例
  • SQLCLR的阶梯 – 仍在进行中
  • SQL Server CLR集成简介 – 官方文档

在你的情况下:

  1. 打开Visual Studio并创buildClass Library Project

    在这里输入图像描述

  2. 然后将该类重命名为StackOverflow并将以下代码粘贴到其文件中:

     using Microsoft.SqlServer.Server; using System; using System.Collections.Generic; using System.Data.SqlTypes; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; public class StackOverflow { [SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true, Name = "RegexReplace")] public static SqlString Replace(SqlString sqlInput, SqlString sqlPattern, SqlString sqlReplacement) { string input = (sqlInput.IsNull) ? string.Empty : sqlInput.Value; string pattern = (sqlPattern.IsNull) ? string.Empty : sqlPattern.Value; string replacement = (sqlReplacement.IsNull) ? string.Empty : sqlReplacement.Value; return new SqlString(Regex.Replace(input, pattern, replacement)); } } 
  3. 现在,build立这个项目。 打开SQL Server Management Studio 。 select您的数据库并replace以下FROM子句的path值以匹配您的StackOverflow.dll

     CREATE ASSEMBLY [StackOverflow] FROM 'C:\Users\gotqn\Desktop\StackOverflow\StackOverflow\bin\Debug\StackOverflow.dll'; 
  4. 最后,创buildSQL CLR函数:

     CREATE FUNCTION [dbo].[StackOverflowRegexReplace] (@input NVARCHAR(MAX),@pattern NVARCHAR(MAX), @replacement NVARCHAR(MAX)) RETURNS NVARCHAR(4000) AS EXTERNAL NAME [StackOverflow].[StackOverflow].[Replace] GO 

您可以直接在您的T-SQL语句中使用RegexReplace .net函数:

  SELECT [dbo].[StackOverflowRegexReplace] ('Hello Kitty Essential Accessory Kit', '[^\u0000-\u007F]', '') //Hello Kitty Essential Accessory Kit 

如果你只是在string中寻找字母和数字, 这可以帮助你。

在这里,正则expression式用于replace字母和数字以外的所有字符。

这似乎工作:

 string input = "Hello Kitty Essential Accessory Kit"; string res = Regex.Replace(input, @"[^a-zA-Z0-9\s]", ""); Console.WriteLine(res); // Hello Kitty Essential Accessory Kit 

尝试这个:

 DECLARE @str VARCHAR(400) DECLARE @expres VARCHAR(50) = '%[~,@,#,$,%,&,*,(,),.,!,Ã,Â]%' SET @str = 'Hello Kitty Essential Accessory Kit' WHILE PATINDEX( @expres, @str ) > 0 SET @str = Replace(REPLACE( @str, SUBSTRING( @str, PATINDEX( @expres, @str ), 1 ),''),'-',' ') SELECT @str 

只需要添加你想在@expresvariables中删除的特殊字符。

希望这可以帮助!