从SQL Server varchar列中删除奇怪的字符(带帽的A)
一些奇怪的字符被存储在表中的一个。 他们似乎来自.csv
饲料,所以我没有太多的控制。
Hello Kitty Essential Accessory Kit
我如何清理它并删除这些字符。 我很好,在数据库级别或在C#中。
编辑
根据评论中收到的build议。 我也在考虑我能做些什么来纠正饲料水平。 这里有更多的信息。
- Feed来自第三方。
- 我打开记事本+ +饲料,并检查编码菜单,我看到在“在ANSI编码”前的点,所以我相信这是文件的编码
- 这就是它出现在记事本++“Hello Kitty基本配件套件”
- 一个奇怪的事情,但。 当我从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集成简介 – 官方文档
在你的情况下:
-
打开
Visual Studio
并创buildClass Library Project
: -
然后将该类重命名为
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)); } }
-
现在,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';
-
最后,创build
SQL 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中删除的特殊字符。
希望这可以帮助!