Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Ánh xạ ký tự / tìm kiếm và thay thế ký tự bằng ký tự trong SQL Server 2008 R2

Điều này có chạy nhanh hơn cho bạn không? (Tôi đã sử dụng đối chiếu SQL_Latin1_General_CP1_CS_AS của mình, bạn có thể muốn thay đổi điều đó).

ALTER FUNCTION [dbo].[ArabicToString] (@inString VARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @MappingCharacters TABLE
    (
        InputCharacter NCHAR(1) COLLATE SQL_Latin1_General_CP1_CS_AS PRIMARY KEY,
        OutputChar NCHAR(1)
    )

    INSERT @MappingCharacters
    VALUES
        ('A', 'ء')
        ,('B', 'آ')
        ,('C', 'أ')
        ,('D', 'ؤ')
        ,('E', 'إ')
        ,('F', 'ئ')
        ,('G', 'ا')
        ,('H', 'ب')
        ,('I', 'ة')
        ,('J', 'ت')
        ,('K', 'ث')
        ,('L', 'ج')
        ,('M', 'ح')
        ,('N', 'خ')
        ,('O', 'د')
        ,('P', 'ذ')
        ,('Q', 'ر')
        ,('R', 'ز')
        ,('S', 'س')
        ,('T', 'ش')
        ,('U', 'ص')
        ,('V', 'ض')
        ,('W', 'ط')
        ,('X', 'ظ')
        ,('Y', 'ع')
        ,('Z', 'غ')
        ,('a', 'ف')
        ,('b', 'ق')
        ,('c', 'ك')
        ,('d', 'ل')
        ,('e', 'م')
        ,('f', 'ن')
        ,('g', 'ه')
        ,('h', 'و')
        ,('i', 'ى')
        ,('j', 'ي')
        ,('v', 'ـ')
        ,('1', '١')
        ,('2', '٢')
        ,('3', '٣')
        ,('4', '٤')
        ,('5', '٥')
        ,('6', '٦')
        ,('7', '٧')
        ,('8', '٨')
        ,('9', '٩')
        ,('0', '٠')
        ,('/', '\')

    DECLARE @Result NVARCHAR(MAX) = ''
        , @Position INT = 1
        , @StrLength INT = DATALENGTH(@inString)

    DECLARE @Vchar char(1), @NextChar NCHAR(1)

    SET @VChar = SUBSTRING(@inString, @Position, 1)
    IF ASCII(@Vchar) > 189 and ASCII(@Vchar) < 255 
    RETURN Rtrim(Ltrim(@inString))

    WHILE (@Position <= @StrLength)  -- leave loop if bad character found
    BEGIN
        -- Reset holders
        SET @NextChar = SUBSTRING(@inString, @Position, 1)

        SET @Result = @Result + ISNULL((SELECT OutputChar FROM @MappingCharacters MC WHERE InputCharacter = @NextChar COLLATE SQL_Latin1_General_CP1_CS_AS), @NextChar)

        -- Add one to position 
        SET @Position= @Position + 1
    END

  RETURN Rtrim(Ltrim(@Result))
END
GO

Nó rất giống nhau, nhưng tôi hy vọng rằng thay vì một loạt else if rất lớn kiểm tra, SQL Server sẽ hoạt động tốt hơn khi làm việc với một tập hợp. Tôi không chắc liệu điều này có hoạt động tốt hơn không nếu @MappingCharacters có phải là một bảng thực hay không.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiệu suất của hàm COUNT SQL

  2. Đầu ra chính xác đầy đủ của các loại dấu phẩy động trong SQL Server Management Studio

  3. Làm cách nào để truy xuất danh sách các tham số từ một thủ tục được lưu trữ trong SQL Server

  4. Cách tạo lối tắt cho SSMS và tự động kết nối với máy chủ SQL mặc định - SQ:Máy chủ / TSQL Hướng dẫn Phần 4

  5. Đặt giới hạn cho một hàng trong bảng trong SQL