SQL Server UDF反转阿拉伯字符

时间:2014-04-08 18:28:32

标签: sql sql-server sql-server-2008 tsql sql-server-2012

我正在尝试开发一个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

1 个答案:

答案 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