ALTER FUNCTION [dbo].[Contains_Arabic_English_Char] ( @RowStr nvarchar(1000) )
RETURNS Char
AS
BEGIN
declare @index int;
declare @charac char(1);
SELECT @index = 0;
declare @thisChar char(1);
while(@index <= LEN(@RowStr))
begin
SELECT @thisChar = SUBSTRING(@RowStr,@index,1);
-- print @index
-- print ASCII(@thisChar)
if (ASCII(@thisChar) BETWEEN 153 and 158 OR ASCII(@thisChar) BETWEEN 162 and 218 OR ASCII(@thisChar) BETWEEN 223 and 254 )
--if (unicode(@thisChar) BETWEEN U+0600 and U+06FF)
begin SELECT @index=-1;
BREAK;
end
else
SELECT @index=@index+1;
end
-- print @index
-- print LEN(@rowStr)
if (@index =-1)
BEGIN
SET @charac = 'A' --''found a Arabic char!'
END
ELSE
BEGIN
SET @charac = 'E' --'no Arabic Char found!' END
RETURN @charac
END
EXEC select [dbo].[Contains_Arabic_English_Char] ('ش')
显示输出为“E”
所以我已经像这样检查了
选择ascii('ش')
输出为63
63是nothng但是问号的'ascii值'?“
答案 0 :(得分:2)
尝试使用UNICODE()而不是ASCII(),因为你正在处理unicode字符。
<强> ASCII():强>
返回的ASCII码值 角色最左边的角色 表达
<强> UNICODE()强>:
返回定义的整数值 按照Unicode标准,第一个 输入表达式的字符。
注意,要运行测试:
-- Returns 63:
select ASCII('ش')
-- Still returns 63:
select UNICODE('ش')
-- Returns 1588. Note the N before the character, to indicate it's a unicode string
select UNICODE(N'ش')
<强>更新强> 您需要改变一些事项:
declare @thisChar char(1);
应该是:
declare @thisChar nchar(1);
然后当你检查那个字符时,只需要使用ASCII()直接交换到UNICODE()