由于我的表包含非英语(包含不同语言的字符)字符和列中的特殊字符.我只需要过滤非英文字符.它应该过滤任何特殊字符.
我尝试使用不同的方法进行过滤,但未能过滤几行.有人请帮帮我.提前致谢.
例如:
列名称LOCATION包含以下行:
第1排:துயஇம்மானுவேல்தேவாலயம்,北街,Idyanvillai,泰米尔纳德邦,印度
第2行:Dr.Hakim M.Asgar Ali的ROY MEDICAL CENTER™Unani诊所位于印度喀拉拉邦,Thycaud Hospital Road,Opp. Amritha Hotel,Thycaud.P.O.,Thiruvananthapuram,喀拉拉邦,印度
第3行:ಕಾಳಿಕಾಂಬದೇವಿ ದೇವಸ್ಥಾನ,Shivaji Nagar,Davangere,印度卡纳塔克邦
由于上面包含许多语言的字符.任何人都可以帮我选择第2行谢谢.
解决方法
T-sql的字符串处理能力非常简陋.
如果通过使用Unicode UTF-16来区分“非英语”字段,您可以尝试类似的东西
SELECT * FROM MyTable WHERE MyField = Cast(MyField AS VARCHAR)
仅拉出UTF-8中可表达的行.
我知道如何测试字段是否从任意字符集中绘制的唯一方法是使用user-defined function,如下所示:
CREATE FUNCTION IsAllowed (@input VARCHAR(MAX)) RETURNS BIT -- Returns 1 if string is allowed,0 otherwise. -- Usages: SELECT dbo.IsAllowed('Hello'); -- returns 1 -- SELECT dbo.IsAllowed('Hello,world!'); -- returns 0 -- Note CHARINDEX is not case sensitive so @allowables doesn't need both. -- VARCHAR(MAX) is different under sql Server 2005 than 2008+ --- and use of defined VARCHAR size might be necessary. AS BEGIN DECLARE @allowables char(26) = 'abcdefghijklmnopqrstuvwxyz'; DECLARE @allowed int = 0; DECLARE @index int = 1; WHILE @index <= LEN(@input) BEGIN IF CHARINDEX(SUBSTRING(@input,@index,1),@allowables)=0 BEGIN SET @allowed = 0; BREAK; END ELSE BEGIN SET @allowed = 1; SET @index = @index+1; END END RETURN @allowed END
SELECT * FROM MyTable WHERE dbo.IsAllowed(MyField) = 1
请注意,模式名称(在本例中为dbo)对于用户定义的函数不是可选的.
如果T-sql用户定义的函数不合适,您也可以使用CLR Function.然后您可以将regexp或其他任何内容应用于列.由于它们会破坏可移植性并带来安全风险,因此许多系统管理员不允许使用CLR功能. (这包括Microsoft的sql Azure产品.)