我正在尝试开发一个UDF来反转阿拉伯字符并保持英文原样。我开发了它但它返回null ..请协助
CREATE FUNCTION [dbo].[StripVenNameAR] (@InString as NVarChar(4000))
RETURNS NVARCHAR(4000) AS
BEGIN
Declare @ReturnVal as smallint
Declare @OutString as NVarchar(4000)
Declare @Pos as smallint
Declare @CurChar as NVarChar(1)
Declare @NEWChar as NVarChar(1)
SET @ReturnVal = 0
IF LEN(@InString) = 0
SET @ReturnVal = 0
ELSE
BEGIN
Set @Pos = 1
SET @OutString = ' '
WHILE (@Pos <= Len(@InString))
BEGIN
Set @CurChar = SUBSTRING(@InString, @Pos, 1)
IF unicode(@CurChar) between 1536 and 1791
SET @NEWChar = REVERSE(@CurChar)
SET @ReturnVal = @Pos
Set @Pos = @Pos + 1
SET @OutString = @OutString + @NEWChar
END
END
RETURN @OutString
END
答案 0 :(得分:0)
对于非阿拉伯字符,@ NEWChar为NULL。将NULL与@OutString组合使用时,结果为NULL。虽然我不确切地知道你的目的是什么,但这里有一个适用于英文字符的功能版本,在我看来可以做你想要的。
编辑:我改变了这个功能来做你想要的。为了实现这一点,您必须将每个文本部分视为一个块,并将该块标识为阿拉伯语或非阿拉伯语。在每个块的末尾,如果块是阿拉伯语,我们附加反转块输出,如果块是非阿拉伯语,则附加直块输出。
CREATE FUNCTION [dbo].StripVenNameAR (@InString AS NVARCHAR(4000))
returns NVARCHAR(4000)
AS
BEGIN
DECLARE @OutString AS NVARCHAR(4000)
DECLARE @Pos AS SMALLINT
DECLARE @CurChar AS NVARCHAR(1)
DECLARE @Mode AS NVARCHAR(2)
DECLARE @PrevMode AS NVARCHAR(2)
DECLARE @PartialString AS NVARCHAR(4000)
SET @Mode = 'EN'
SET @PrevMode = 'EN'
SET @Pos = 1
SET @OutString = ' '
SET @PartialString = ''
WHILE ( @Pos <= Len(@InString) )
BEGIN
SET @CurChar = Substring(@InString, @Pos, 1)
SET @Mode = CASE
WHEN Unicode(@CurChar) BETWEEN 1536 AND 1791 THEN 'AR'
ELSE 'EN'
END
IF ( @PrevMode <> @Mode )
BEGIN
IF ( @PrevMode = 'AR' )
SET @OutString = @OutString + Reverse(@PartialString)
ELSE
SET @OutString = @OutString + @PartialString
SET @PartialString = ''
END
SET @Pos = @Pos + 1
SET @PartialString = @PartialString + @CurChar
SET @PrevMode = @Mode
END
IF ( @PrevMode = 'AR' )
SELECT @OutString = @OutString + Reverse(@PartialString)
ELSE
SELECT @OutString = @OutString + @PartialString
RETURN @OutString
END