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

clr enabled Server Configuration Option

USE master
GRANT UNSAFE ASSEMBLY to login_name

USE your_db_name
ALTER DATABASE your_db_name
SET TRUSTWORTHY ON

exec sp_changedbowner [sa]
GO

CREATE ASSEMBLY [System.Xml.Linq]
AUTHORIZATION [dbo]
FROM 'C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Xml.Linq.dll'
WITH PERMISSION_SET = UNSAFE
GO

CLR kullanımını aktif hale getirmek için aşağıdaki kodlar yeterlidir. Ancak yukarıda ki adımlar CLR içerisinde ekstra bir kütüphane kullanıldığında yada ek bir özellik için ihtiyaç olduğunda kullanılabilir.

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO

Kaynak;

Enabling CLR Integration
CLR Integration Code Access Security

Open Closed Principle (OCP)

Open Closed Principle (OCP)

”Software entities (Classes, modules, functions) should be OPEN for EXTENSION, CLOSED for MODIFICATION.”

Geliştirilen sistemlerin yaşam süreleri boyunca değişimlere uğrayabileceği göz önüne alındığında, bu prensip genişletilmeye açık ama değişikliğe kapalı varlıkların (Sınıf, Method vs.) kullanılmasını önerir.

Peki yazılımın kaynak kodunu değiştirmeden, geliştirdiğimiz modullerin böyle bir davranış sergilemesini sağlayabiliriz?
Bu soruyu soyutlayarak (abstraction) diye cevaplayabiliriz. Bir sınıfı soyutlayarak manupule edebilirz.

(daha&helliip;)

Single Responsibility Principle (SRP)

Single Responsibility Principle (SRP)

“THERE SHOULD NEVER BE MORE THAN ONE REASON FOR A CLASS TO  CHANGE”

Tasarlanan her sınıfın sadece tek bir sorumluluğu olmalı ve sınıfın değişikliğe uğraması için birden fazla neden olmamalıdır. SRP,  birbirine sıkı sıkıya bağlı olan sınıflarla benzerlik göstermektedir. Prensibe tasarımsal olarak baktığımızda ise sınıf bir sorumluğu yerine getirirken diğer sınıf fonksiyoneliteyi gerçekleştirmektedir. Buradaki sorumluğu netleştirecek olursak, sınıfın sadece tekbir metod içereceği anlamına gelmez. Sorumluluk sınıf içerisinde bir çok metod kullanılarak gerçekleştirilebilir.

(daha&helliip;)