تبدیل اول کلمه‌ها به حروف برزگ در SQL Server

در چند روز اخیر چالشی که پیش رو داشتم همین بود که اول کلمه‌های انگلیسی رو با حروف بزرگ تفکیک کنم و به روشی سریع و با دقت نیاز داشتم تا بتونم این کار رو با کمترین هزینه انجام بدم خیلی جستجو کردم و در نهایت به نتیجه‌ای رسیدم که میشه خیلی ساده با تعریف یک تابع (Function) هوشمند به نتیجه مطلوب رسید.

declare @test nvarchar(max)
select @test = dbo.ProperCase(N'Amin''S mcHouse')
select @test as test 

خروجی:

Amin's McHouse

 

در ابتدا باید ورودی این تابع(Function) متغیری از جنس VarChar در نظر بگیریم چون به جز حروف انگلیسی کاربردی ندارد (البته میتوان از NvarChar هم استفاده کرد و کارهای متفاوت دیگری انجام داد)

 

در مورد نحوه تعریف این Function چند مرحله رو باید در نظر گرفت:

 

1) همه حروف باید کوچک شوند، چون ممکن است حروف بزرگ نیز در وسط هر کلمه باشد سپس نتیجه را در متغیر کمکی میریزیم.

 

2) تا زمانی که در رشته فاصله وجود داشت مکان کلمه ها را شناسایی میکنیم و با جدا سازی آنها ابتدا حرف اول هر کدام را تبدیل به حروف بزرگ کرده و آن را به متغیر دیگری اضافه میکنیم.

 

3) در صورتی که میخواهید کلماتی از قبل رزرو رو بررسی کنید در مرحله قبل نیاز دارید آنها را تعریف نمایید. این روش به این شکل کار میکند که کلمه رزرو رو پاک میکنیم تا اولین حرف بعد از کلمه رزرو به حرف بزرگ تبدیل شود. و در مرحله آخر این کلمات را به آن کلمه جدا شده اضافه میکنیم. (به طور مثال mc که اگر اول کلمه بود باید به شکل Mc نوشته شود)

 

4) در مرحله آخر هر دور از حلقه نیز عملیات Trim روی کلمه انجام میشود. (حذف فاصله‌های اضافی)

 

5) حال باید اولین حرف بعد از کلمه رزرو را تبدیل به حرف بزرگ کرده و فاصله‌ها را حذف میکنیم (برای انجام تغییرات دیگر میتوانید قوانین خود را به خط های انتهایی اضافه کنید)

 

6) مقدار تولید شده را برمیگردانیم

 

کدهای نوشته شده زیر میتواند تابع مورد نظر شما باشد.

Create FUNCTION [dbo].[ProperCase] (@String varchar(8000))
RETURNS varchar(8000)
AS
BEGIN

  DECLARE @TempString varchar(8000)
  DECLARE @PS varchar(8000)

  SET @PS = ''
  -- تمامی رشته ورودی به حروف کوچک تبدیل شوند
  SET @TempString = LOWER(@String)
  WHILE PATINDEX('%[-( '']%', @TempString) > 0
  BEGIN
    -- اگر اولین حرف از رشته ورودی فاصله بود
    IF (PATINDEX('%[-( '']%', SUBSTRING(@TempString, 1, 1)) > 0)
    BEGIN
      SET @PS = @PS + SUBSTRING(@TempString, 1, 1)
    END
    ELSE -- اگر رشته ورودی با کلمات رزرو شروع شده بود
    BEGIN
      IF SUBSTRING(@TempString, 1, 2) = 'mc'
      BEGIN
        SET @PS = @PS + 'Mc'
        SET @TempString = SUBSTRING(@Tempstring, 3, LEN(@TempString))
      END
      IF SUBSTRING(@TempString, 1, 3) = 'mac'
      BEGIN
        SET @PS = @PS + 'Mac'
        SET @TempString = SUBSTRING(@Tempstring, 4, LEN(@TempString))
      END

      -- تبدیل اولین حرف به کاراکتر بزرگ تا پیدا کردن فاصله بعدی
      SET @PS = @PS + UPPER(SUBSTRING(@TempString, 1, 1)) + SUBSTRING(@TempString, 2, PATINDEX('%[-( '']%', @TempString) - 1)
    END
    -- کوتاه کردن رشته‌ای که ما پردازش کردیم‌

    SET @TempString = SUBSTRING(@TempString, PATINDEX('%[-( '']%', @TempString) + 1, LEN(@TempString))
    -- برداشتن فاصله های اضافی
    SET @TempString = LTRIM(@TempString)
  END

  IF SUBSTRING(@TempString, 1, 2) = 'mc'
  BEGIN
    SET @PS = @PS + 'Mc'
    SET @TempString = SUBSTRING(@Tempstring, 3, LEN(@TempString))
  END
  IF SUBSTRING(@TempString, 1, 3) = 'mac'
  BEGIN
    SET @PS = @PS + 'Mac'
    SET @TempString = SUBSTRING(@Tempstring, 4, LEN(@TempString))
  END
  -- تبدیل اولین حرف به حروف بزرگ قبل از اسم یا کلمه رزرو
  SET @PS = @PS + UPPER(SUBSTRING(@TempString, 1, 1)) + SUBSTRING(@TempString, 2, LEN(@TempString))
  -- سفارشی سازی نهایی برای تبدیل فاصله ها یا دیگر تغییراتی که لازم دارید
  SET @PS = REPLACE(@PS, ' -', '-')
  SET @PS = REPLACE(@PS, ' ''', '''')
  SET @PS = REPLACE(@PS, '''S', '''s')

  RETURN (@PS)
END

نظرات

برای نظر دادن کافیست وارد حساب کاربری خود شوید.