C# 如何使用美英字符执行数据清理和子站点unicode(拉丁)Carachter

C# 如何使用美英字符执行数据清理和子站点unicode(拉丁)Carachter,c#,tsql,C#,Tsql,是否有方法执行数据清理和识别拉丁字符,如Á(及类似字符),并将其转换为最接近的美式英语字符(在本例中为“a”) 我更喜欢直接在TSQL代码中执行此操作,但如果不可能,我愿意使用其他选项,例如任何C#方法 我在一张表中有数十万条记录。数据条目有这样的错误,这些错误会导致问题,从而破坏代码 谢谢 更新的Anwer(20120212): 虽然我下面的答案会起作用,而且考虑到T-SQL翻译速度特别快,gotn发布的内容和David上面的答案会表现得更好 值得一提的是(我刚刚了解到这一点)cyrlic\

是否有方法执行数据清理和识别拉丁字符,如Á(及类似字符),并将其转换为最接近的美式英语字符(在本例中为“a”)

我更喜欢直接在TSQL代码中执行此操作,但如果不可能,我愿意使用其他选项,例如任何C#方法

我在一张表中有数十万条记录。数据条目有这样的错误,这些错误会导致问题,从而破坏代码

谢谢

更新的Anwer(20120212): 虽然我下面的答案会起作用,而且考虑到T-SQL翻译速度特别快,gotn发布的内容和David上面的答案会表现得更好

值得一提的是(我刚刚了解到这一点)
cyrlic\u General\u CI\u AI
Greek\u CI\u AI
同样有效。知道这一点很好,因为某些排序规则的性能比其他排序规则好,所以最好进行测试


先前的答案 您没有提到您正在使用的SQL Server版本

如果您使用的是SQL Server 2017+

然后,您可以像这样利用:

返回:敏捷的绿狐跳过了懒狗

如果您使用的是早期版本的SQL

为此,您可以利用创建自己的翻译功能,我在本文末尾介绍了这一功能

SELECT      t.NewString
FROM        (VALUES('áÁâÂäÄãÃàÀéÉêÊëËèÈíÍîÎïÏìÌóÓôÔöÖõÕòÒúÚûÛüÜùÙýÝñÑçÇ')) AS accents(C)
CROSS APPLY (VALUES('aAaAaAaAaAeEeEeEeEiIiIiIiIoOoOoOoOoOuUuUuUuUyYnNcC')) AS clean(C)
CROSS APPLY samd.translate8K(@string,accents.C,clean.C)     AS t;
以下是我用来生成重音字符字符串的代码:

SELECT CONCAT(
  CHAR(225),CHAR(193),CHAR(226),CHAR(194),CHAR(228),CHAR(196),CHAR(227),CHAR(195),CHAR(224),CHAR(192), -- a(10)
  CHAR(233),CHAR(201),CHAR(234),CHAR(202),CHAR(235),CHAR(203),CHAR(232),CHAR(200),                     -- e(8)
  CHAR(237),CHAR(205),CHAR(238),CHAR(206),CHAR(239),CHAR(207),CHAR(236),CHAR(204),                     -- i(8)
  CHAR(243),CHAR(211),CHAR(244),CHAR(212),CHAR(246),CHAR(214),CHAR(245),CHAR(213),CHAR(242),CHAR(210), -- o(10)
  CHAR(250),CHAR(218),CHAR(251),CHAR(219),CHAR(252),CHAR(220),CHAR(249),CHAR(217),                     -- u(8)
  CHAR(253),CHAR(221),CHAR(241),CHAR(209),CHAR(231),CHAR(199))                               -- y(2),n(2),c(2)
自定义翻译功能:

CREATE FUNCTION samd.translate8K
(
  @inputString  VARCHAR(8000), 
  @characters   VARCHAR(8000), 
  @translations VARCHAR(8000)
)
RETURNS TABLE WITH SCHEMABINDING AS RETURN
/*****************************************************************************************
[Purpose]: Custom version of SQL Server 2017 Translate

-- Masking possible PII
DECLARE @inputstring VARCHAR(8000) = 
  'I don''t know if you got my SSN but it''s 555-90-5511. Call me at 312.800.5555';

SELECT t.newstring
FROM   samd.translate8K(@inputString, '0123456789', REPLICATE('#',10)) AS t;

[Revision History]:
------------------------------------------------------------------------------------------
 Rev 00 - 20180725 - Initial Development - Alan Burstein
****************************************************************************************/
SELECT newstring = 
(
  SELECT      CASE WHEN c.chr>c.tx THEN '' WHEN c.chr>0 THEN t.chr ELSE ng.token END+''
  FROM        samd.NGrams8k(@inputString,1)                                 AS ng 
  CROSS APPLY (VALUES(CHARINDEX(ng.token, @characters),LEN(@translations))) AS c(chr,tx)
  CROSS APPLY (VALUES(SUBSTRING(@translations,c.chr,1)))                    AS t(chr)
  ORDER BY ng.position
  FOR XML PATH(''), TYPE
).value('text()[1]', 'varchar(8000)');
GO

更新的Anwer(20120212): 虽然我下面的答案会起作用,而且考虑到T-SQL翻译速度特别快,gotn发布的内容和David上面的答案会表现得更好

值得一提的是(我刚刚了解到这一点)
cyrlic\u General\u CI\u AI
Greek\u CI\u AI
同样有效。知道这一点很好,因为某些排序规则的性能比其他排序规则好,所以最好进行测试


先前的答案 您没有提到您正在使用的SQL Server版本

如果您使用的是SQL Server 2017+

然后,您可以像这样利用:

返回:敏捷的绿狐跳过了懒狗

如果您使用的是早期版本的SQL

为此,您可以利用创建自己的翻译功能,我在本文末尾介绍了这一功能

SELECT      t.NewString
FROM        (VALUES('áÁâÂäÄãÃàÀéÉêÊëËèÈíÍîÎïÏìÌóÓôÔöÖõÕòÒúÚûÛüÜùÙýÝñÑçÇ')) AS accents(C)
CROSS APPLY (VALUES('aAaAaAaAaAeEeEeEeEiIiIiIiIoOoOoOoOoOuUuUuUuUyYnNcC')) AS clean(C)
CROSS APPLY samd.translate8K(@string,accents.C,clean.C)     AS t;
以下是我用来生成重音字符字符串的代码:

SELECT CONCAT(
  CHAR(225),CHAR(193),CHAR(226),CHAR(194),CHAR(228),CHAR(196),CHAR(227),CHAR(195),CHAR(224),CHAR(192), -- a(10)
  CHAR(233),CHAR(201),CHAR(234),CHAR(202),CHAR(235),CHAR(203),CHAR(232),CHAR(200),                     -- e(8)
  CHAR(237),CHAR(205),CHAR(238),CHAR(206),CHAR(239),CHAR(207),CHAR(236),CHAR(204),                     -- i(8)
  CHAR(243),CHAR(211),CHAR(244),CHAR(212),CHAR(246),CHAR(214),CHAR(245),CHAR(213),CHAR(242),CHAR(210), -- o(10)
  CHAR(250),CHAR(218),CHAR(251),CHAR(219),CHAR(252),CHAR(220),CHAR(249),CHAR(217),                     -- u(8)
  CHAR(253),CHAR(221),CHAR(241),CHAR(209),CHAR(231),CHAR(199))                               -- y(2),n(2),c(2)
自定义翻译功能:

CREATE FUNCTION samd.translate8K
(
  @inputString  VARCHAR(8000), 
  @characters   VARCHAR(8000), 
  @translations VARCHAR(8000)
)
RETURNS TABLE WITH SCHEMABINDING AS RETURN
/*****************************************************************************************
[Purpose]: Custom version of SQL Server 2017 Translate

-- Masking possible PII
DECLARE @inputstring VARCHAR(8000) = 
  'I don''t know if you got my SSN but it''s 555-90-5511. Call me at 312.800.5555';

SELECT t.newstring
FROM   samd.translate8K(@inputString, '0123456789', REPLICATE('#',10)) AS t;

[Revision History]:
------------------------------------------------------------------------------------------
 Rev 00 - 20180725 - Initial Development - Alan Burstein
****************************************************************************************/
SELECT newstring = 
(
  SELECT      CASE WHEN c.chr>c.tx THEN '' WHEN c.chr>0 THEN t.chr ELSE ng.token END+''
  FROM        samd.NGrams8k(@inputString,1)                                 AS ng 
  CROSS APPLY (VALUES(CHARINDEX(ng.token, @characters),LEN(@translations))) AS c(chr,tx)
  CROSS APPLY (VALUES(SUBSTRING(@translations,c.chr,1)))                    AS t(chr)
  ORDER BY ng.position
  FOR XML PATH(''), TYPE
).value('text()[1]', 'varchar(8000)');
GO
参考:(感谢评论中的@gotqn)

结果:

hello! this is a test!
参考:(感谢评论中的@gotqn)

结果:

hello! this is a test!
您可以简单地转换T-SQL:-)中的数据您可以简单地转换T-SQL:-)中的数据