MS SQL Server

Veriler üzerinde LIKE ve PATINDEX operatörlerini kullanarak string manipülasyonları

Bu makale Doron Farber, tarafından 28 Mart 2011 tarihinde yazılmıştır. Ziyaretçilerime faydası olacağını düşündüğüm için yazının çevirisini yaptım.

Yazının amacı veri tabanında farklı formatlarda oluşturulmuş tarih (Date and Time) kolonlarını içerisinde yer alan verileri daha genel bir formatta (YYYMMDD) düzenleyip veri temizliği yapmaktır. Farklı tarih formatlarına ait temizlik için kullandığımız örnek veriler aşağıdaki gibidir.

(daha&helliip;)

Generate Insert Script

Prosedür, kendisine parametre olarak verilmiş olan table yada view’in yapısına uygun olan INSERT ifadelerini oluşturur. Daha sonrasında bu INSERT ifadelerini kullanarak verilerinizi tekrar tabloya insert edebilirsiniz. Database uygulamalarınızı paket haline getirmek için faydalı bir araç olmasıyla berabar bazı durumlarda çok kullanışlı olabilmektedir. Örneğin bir uygulamaya teknik destek vereceğiniz zaman örnek verileri bu prosedürü kullanarak hızlı bir şekilde oluşturabilirsiniz.

SQL Server 2000 versiyonunu indirmek için tıklayınız.

SQL Server 2005 versiyonunu indirmek için tıklayınız.

(daha&helliip;)

SQL İpuçları

Bir tablodaki bir kolonun satırlarını tek bir text haline getirmek için aşağıdaki script ihtiyacımızı karşılayacaktır.

FirstName
Gustavo
Catherine
Kim

Örneğin Contact tablosunda bulunan FirstName kolonundaki bilgileri script çalıştırıldığında “Gustavo, Catherine, Kim” şeklinde görüntülenecektir.

DECLARE @Names VARCHAR(8000)
SELECT @Names = COALESCE(@Names + ', ', '') + ISNULL(FirstName, 'N/A') FROM Person.Contact

-- Veya

SELECT Stuff(
  (SELECT N', ' + FirstName FROM Person.Contact FOR XML PATH(''),TYPE) .value('text()[1]','nvarchar(max)'),1,2,N'')

Yukarıdaki işlemin tersini yapma ihtiyacı olduğunda ise aşağıdaki fonksiyon ile tekrar text halinden tablo haline dönüşüm gerçekleştirebilirsiniz.

--Kullanım
SELECT * FROM dbo.Split('Gustavo, Catherine,Kim',',')

--Script
CREATE FUNCTION [dbo].[Split](@STRING varchar(MAX), @Delimiter char(1))
RETURNS @Results TABLE (indx int, Items varchar(MAX))
AS

    BEGIN
    DECLARE @INDEX INT;DECLARE @SLICE varchar(MAX);
    SELECT @INDEX = 1;
    IF @STRING IS NULL RETURN
    DECLARE @i as int ;
    SET @i = 1;
    WHILE @INDEX !=0
        BEGIN
        	SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
        	IF @INDEX !=0
        		SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
        	ELSE
        		SELECT @SLICE = @STRING
        	INSERT INTO @Results(indx, Items) VALUES(@i, @SLICE)
        	SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
        	IF LEN(@STRING) = 0 BREAK
            SET @i = @i + 1
        END
    RETURN
END
00002254465 gibi kayıtların başındaki sıfırları silebilmek için kullanılabilecek bir fonksiyon;
CREATE FUNCTION RemoveLeadingZerosFromVarChar
(
      @inputStr varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
      DECLARE @Result varchar(max)
 
      SELECT @Result = replace(replace(ltrim(replace(
          replace(ltrim(@inputStr), ' ', '¬') 
          , '0', ' ') 
          ) 
          , ' ', '0') 
          , '¬', ' ') 
      RETURN @Result
END
GO
İki tarih arasındaki çalışma günlerini bulmak için kullanılabilecek script
CREATE FUNCTION dbo.GetWorkingDays
  ( @StartDate datetime,
    @EndDate datetime )
RETURNS INT
AS
BEGIN
  DECLARE @WorkDays int, @FirstPart int
  DECLARE @FirstNum int, @TotalDays int
  DECLARE @LastNum int, @LastPart int
  IF (DATEDIFF(day, @StartDate, @EndDate) < 2)
    BEGIN
      RETURN ( 0 )
    END
  SELECT
   @TotalDays = DATEDIFF(day, @StartDate, @EndDate) - 1,
   @FirstPart = CASE DATENAME(weekday, @StartDate)
                 WHEN 'Sunday' THEN 6
                 WHEN 'Monday' THEN 5
                 WHEN 'Tuesday' THEN 4
                 WHEN 'Wednesday' THEN 3
                 WHEN 'Thursday' THEN 2
                 WHEN 'Friday' THEN 1
                 WHEN 'Saturday' THEN 0
               END,
   @FirstNum = CASE DATENAME(weekday, @StartDate)
                 WHEN 'Sunday' THEN 5
                 WHEN 'Monday' THEN 4
                 WHEN 'Tuesday' THEN 3
                 WHEN 'Wednesday' THEN 2
                 WHEN 'Thursday' THEN 1
                 WHEN 'Friday' THEN 0
                 WHEN 'Saturday' THEN 0
               END
  IF (@TotalDays < @FirstPart)
     BEGIN
       SELECT @WorkDays = @TotalDays
     END
  ELSE
     BEGIN
       SELECT @WorkDays = (@TotalDays - @FirstPart) / 7
       SELECT @LastPart = (@TotalDays - @FirstPart) % 7
       SELECT @LastNum = CASE
         WHEN (@LastPart < 7) AND (@LastPart > 0) THEN @LastPart - 1
         ELSE 0
       END
       SELECT @WorkDays = @WorkDays * 5 + @FirstNum + @LastNum
     END
  RETURN ( @WorkDays )
END
GO

Kullanımı ;

SELECT dbo.GetWorkingDays ('2012-01-01', '2012-12-01')

SQL Server’da Index Kavramı

Sql Server index’lerinin gücünü bu makaleyi okuyana kadar anlayamamıştım. Bu makaleyi okuduktan sonra tasarımlarınız ve kodlarınızda performans açısından iyileştirmeler yapabilirsiniz.

Yazan: Turgay Sahtiyan

Teknik İnceleme: Batuhan Yıldız

Yayınlanma Tarihi: Şubat 2011
Özet: Bu makale, Index kullanımının amacını ve faydalarını sorguladıktan sonra, Index tiplerinin arasındaki farkları derinlemesine inceleyip, bakım işlemlerinin nasıl yapılacağı üzerinde duracaktır.

Makale’yi İndir