16 Temmuz 2017 Pazar

EXCEPT ve INTERSECT Operatörleri

Bu bu iki operatör iki sorgunun sonuçlarını karşılaştırarak farklı değerleri döndürür.

INTERSECT operatörü iki sorgu sonucu karşılaştırırak kesişimini verir.

USE AdventureWorks2014;
GO
SELECT ProductID
FROM Production.Product
INTERSECT
SELECT ProductID

FROM Production.WorkOrder ;

EXPECT operatörü ise iki farklı sorgu sonucunun karşılaştırırken intersect operatöründen farklı olarak sadece ilk sonuç setinde olup ikici sorgu sonucunda olmayan kayıtları listelememizi sağlamaktadır.

USE AdventureWorks2014;
GO
SELECT ProductID
FROM Production.Product
EXCEPT
SELECT ProductID

FROM Production.WorkOrder ;

12 Temmuz 2017 Çarşamba

UNION ve UNION ALL Operatörleri


UNION operatoru iki veya daha fazla SELECT deyiminin sonuc kümesini birleştirmek için kullanılır

Her SELECT deyimi aynı sayıda kolon içermelidir ve sutunlarda benzer veri tipleri olmalıdır. Her SELECT deyiminde aynı sıra ile olmalıdır.


UNION operatörü varsayılan olarak yalnızca farklı değerleri seçer. Yani yinelenen değerlerden sadece bir tanesini getirir. Yinelenen değerlere izin vermek için UNION ALL kullanılmaktadır.

-- Uses AdventureWorks 

IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL 
DROP TABLE dbo.Gloves; 
GO 
-- Create Gloves table. 
SELECT ProductModelID, Name 
INTO dbo.Gloves 
FROM Production.ProductModel 
WHERE ProductModelID IN (3, 4); 
GO 

-- Here is the simple union. 
-- Uses AdventureWorks 

SELECT ProductModelID, Name 
FROM Production.ProductModel 
WHERE ProductModelID NOT IN (3, 4) 
UNION 
SELECT ProductModelID, Name 
FROM dbo.Gloves 
ORDER BY Name; 

GO  

7 Temmuz 2017 Cuma

sp_msforeachdb Stored Procedure Kullanarak Tüm Databaselerin CheckDB Yapılması

sp_msforeachdb stored prosedürü master veritabanı altında bulunan oldukça yararlı bir stored prosedürdür. Bu stored prosedür ile tüm DBlerin içinde dönebilir ve istediğiniz işlemi tüm dbler üzerinde yapabiliriz.

Aşağıdaki scriptte tüm databaselerin üzerindeki tüm nesneler  üzerinde dolaşarak  mantıksal ve fiziksel veri bütünlüğü  kontrolü yapabiliriz.

exec sp_MSforeachDB 'DBCC CHECKDB (?) WITH ALL_ERRORMSGS, EXTENDED_LOGICAL_CHECKS, DATA_PURITY'

6 Temmuz 2017 Perşembe

OFFSET ve FETCH NEXT Özelliğinin Kullanımı

Bugünkü yazımda sizlere SQL Server 2012 ile yeni gelen özelliklerden birisi olan  OFFSET  ve FETCH NEXT özelliğinden bahsetmek istiyorum. Bu özellikler verileri sayfalamak (paging) için kullanılır.

OFFSET-FETCH kullanımındaki kısıtlamalar

  • OFFSET-FETCH yalnızca ORDER BY yan tümcesi ile kullanılabilir.
  • FETCH ile OFFSET maddesi zorunludur. ORDER BY ... FETCH OFFSET olmadan kullanılamaz.
  • TOP, aynı sorgu ifadesinde OFFSET ve FETCH ile birleştirilemez.

ÖRNEK1  Sıralama edilen sonuç kümesinden ilk 10 satırı atlanır ve kalan satırları döndür.

SELECT FirstName + ' ' + LastName FROM  [Person].[Person] ORDER BY FirstName  OFFSET 10 ROWS;

ÖRNEK2  Sıralama edilen sonuç kümesinden ilk 10 satırı atlanır ve kalan 5 satırı döndür.

SELECT FirstName + ' ' + LastName FROM  [Person].[Person] ORDER BY FirstName  OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY;

OFFSET  ve FETCH NEXT Özelliğinin Kullanımı 

5 Temmuz 2017 Çarşamba

ISNULL, NULLIF ve COALESCE Fonksiyonları

SQL Server'ın ISNULL () fonksiyonu, NULL değerlerine nasıl davranılmasını istediğinizi belirtmek için kullanılır. Aşağıdaki örnekte MaxQty NULL ise 0 olarak değer döndürmesi sağlanmıştır.

USE AdventureWorks2014; 
GO 
SELECT Description, DiscountPct, MinQty, ISNULL(MaxQty, 0.00) AS 'Max Quantity' 
FROM Sales.SpecialOffer; 
GO 

NULLIF fonksiyonunda ise iki değer birbirine eşit ise  NULL değer döndürecektir.

USE AdventureWorks2014; 
GO 
SELECT ProductID, MakeFlag, FinishedGoodsFlag,  
   NULLIF(MakeFlag,FinishedGoodsFlag)AS 'Null if Equal' 
FROM Production.Product 
WHERE ProductID < 10; 
GO 
COALESCE  ise birden fazla parametreyle çalışır ve eğer kolon null ise null olmayan ilk parametreyi getirir.

USE AdventureWorks2014; 
GO 
SELECT Name, Class, Color, ProductNumber, 
COALESCE(Class, Color, ProductNumber) AS FirstNotNull 

FROM Production.Product

TRY_CONVERT, TRY_PARSE ve PARSE Fonksiyonları

Bugünkü yazımda sizlere SQL Server 2012 ile gelen TRY_CONVERT, TRY_PARSE ve PARSE fonksiyonlardan bahsetmek istiyorum

TRY_CONVERT fonksiyonu bir veri tipinden diğer veri tipine dönüşüm için kullanılır. CAST ve CONVERT fonksiyonlarından farkı ise belirtilen veri tipine dönüştürme gerçekleşmez ise fonksiyon hata vermez. Null değer döndürür.

SELECT
    CASE WHEN TRY_CONVERT(float, 'test') IS NULL
    THEN 'Cast failed'
    ELSE 'Cast succeeded'
END AS Result;
GO

TRY_PARSE fonksiyonu TRY_CONVERT gibi çalışır. TRY_PARSE fonksiyonu string fonksiyonundan diğer fonksiyonlara çevrim yapar.

SELECT
    CASE WHEN TRY_PARSE('Aragorn' AS decimal USING 'sr-Latn-CS') IS NULL
        THEN 'True'
        ELSE 'False'
END
AS Result


PARSE fonksiyonu, CAST ve CONVERT fonksiyonlarından farklı olarak sadece string dataları girdi olarak kabul eder. Bir string değeri  tam sayı, date ve time  veri tiplerine dönüştürmek için kullanılır.  Bu dönüşümde kültür kodu parametre olarak verilebilir.

SELECT PARSE('Monday, 06 august 2012' AS Datetime2  USING 'tr-TR') AS [PARSE Function Result]

GO

CAST ve CONVERT Fonksiyonları

Cast ve Convert Fonksiyonları SQL Serverda Tür dönüşümü için kullanılan fonksiyonlardır.  Her ikisininde yaptığı iş aynıdır. Sadece Convertte stilini değiştirebiliriz.

CAST için Syntax aşağıdaki gibidir.
CAST ( expression AS data_type [ ( length ) ] )

CONVERT için Syntax ise aşağıdaki gibidir.

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

-- CAST Kullanımı
USE AdventureWorks2014;
GO
SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice
FROM Production.Product
WHERE CAST(ListPrice AS int) LIKE '3%';
GO

-- CONVERT Kullanımı
USE AdventureWorks2014;
GO
SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice
FROM Production.Product
WHERE CONVERT(int, ListPrice) LIKE '3%';
GO

26 Haziran 2017 Pazartesi

Sql Server IIF ve CHOOSE Fonksiyonları

Bu yazımda sizlere SQL Server 2012 ile birlikte gelen IIF ve CHOOSE mantıksal fonksiyonlarından bahsetmek istiyorum.

İlk önce CHOOSE fonksiyonundan bahsedecek olursak bu fonksiyon kullanılabilir değerlerin listesinden belirtilen dizindeki öğeyi döndürür. Aşağıki örnek seçeneklerden 3. değeri seçmek istiyoruz.
SELECT 'New SQL Server Release' = CHOOSE(3, 'SQL Server 2008', 'SQL Server 2008 R2',
'SQL Server 2012')

GO

Aşağıdaki örnekte ise CHOOSE fonksiyonu ayın değerini döndürmek için kullanılmıştır.
Use [AdventureWorks2014]
GO
SELECT
  DISTINCT(FirstName + ' ' + LastName) AS Name
 ,DATEPART(DD, ModifiedDate) AS [Date]
 ,CHOOSE(DATEPART(MM,ModifiedDate),'January','February','March','April','May','June',
  'July','August','September','October','November','December')[Month]
 ,DATEPART(YYYY, ModifiedDate) AS [Year]
FROM [Person].[Person]
 ORDER BY Name ASC

IIF fonksiyonu ise boolean verileri karşılaştırarak iki değerden bir tanesini döndürür. Aşağıdaki örnekte StateProvinceCode 0 ile 95 arasındaysa Fransa aksi takdirde Kanada değerini söndürecektir.

SELECT
   StateProvinceCode
  ,CountryRegionCode
  ,IIF(TRY_PARSE(StateProvinceCode AS INT) Between 0 AND 95,'France','Canada') AS Country
FROM Person.StateProvince

  WHERE StateProvinceCode IN ('95','AB')


12 Mayıs 2017 Cuma

Sql Server Index Bakımında Cursor Kullanımı

Tablolarımız üzerinde bulunan indexler zamanla çalışan sorgular neticesinde bozulmalara uğramaktadır. Bu indexlerin belirli periyotlarla rebuild veya reorganize edilmesi gerekir. %5 ile %30 arası bozulmalarda reorganize %30 üzeri bozulmalarda ise rebuild işlemi yapılması Microsoft'un meşhur deyimi ile Best Practicedir.

Yukarıdada bahsettiğim gibi oluşturduğumuz indexlerde veri eklenmesi silinmesi gibi işlemler oldukça indexlerimiz pageleri arasında boşluklar oluşacak ve btree veri yapımızın dengesi bozulacaktır. Bu nedenle düzenli olarak bozulan indexlerimizi bulup bozulma oranlarına göre rebuild veya reorganize etmemiz gerekir.

Aşağıdaki DMV kullanılarak indexlerideki bozulma oranlarını görebiliriz.
SELECT TOP 200
DB_NAME() AS databaseName
,OBJECT_SCHEMA_NAME(s.object_id) AS SchemaName
, OBJECT_NAME(s.[object_id]) As TableName
,i.name As IndexName
,ROUND(s.avg_fragmentation_in_percent,2) AS [Fragmentation %]
FROM sys.dm_db_index_physical_stats(db_id(),null,null,null,null) s
INNER JOIN sys.indexes i on s.[object_id] =i.[object_id]
and s.index_id=i.index_id
INNER JOIN sys.indexes o on i.object_id=o.object_id
WHERE s.database_id=DB_ID()
and i.name is not null
and OBJECTPROPERTY(s.[object_id],'IsMsShipped')=0

order by [Fragmentation %] desc


Bu bozulma oranlarını gördükten sonra çeşitli yöntemlerle index bakımı yapabiliriz. Aşağıdaki scriptte cursor kullanarak index bakımını çok kolaylıkla yapabiliriz.

DECLARE @Database VARCHAR(255)  
DECLARE @Table VARCHAR(255) 
DECLARE @cmd NVARCHAR(500) 
DECLARE @fillfactor INT
SET @fillfactor = 30
DECLARE DatabaseCursor CURSOR FOR
SELECT name FROM master.dbo.sysdatabases  
WHERE name  IN ('SAROT_OTEL')  
ORDER BY
OPEN DatabaseCursor 
FETCH NEXT FROM DatabaseCursor INTO @Database
WHILE @@FETCH_STATUS =
BEGIN
   SET @cmd = 'DECLARE TableCursor CURSOR FOR SELECT ''['' + table_catalog + ''].['' + table_schema + ''].['' +
  table_name + '']'' as tableName FROM [' + @Database + '].INFORMATION_SCHEMA.TABLES
  WHERE table_type = ''BASE TABLE''' 
   -- create table cursor 
   EXEC (@cmd) 
   OPEN TableCursor  
   FETCH NEXT FROM TableCursor INTO @Table 
   WHILE @@FETCH_STATUS = 0  
   BEGIN 
       IF (@@MICROSOFTVERSION / POWER(2, 24) >= 9)
       BEGIN
           -- SQL 2005 or higher command
           SET @cmd = 'ALTER INDEX ALL ON ' + @Table + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ')'
           EXEC (@cmd)
       END
       ELSE
       BEGIN
          -- SQL 2000 command
          DBCC DBREINDEX(@Table,' ',@fillfactor) 
       END
       FETCH NEXT FROM TableCursor INTO @Table 
   END 
   CLOSE TableCursor  
   DEALLOCATE TableCursor 
   FETCH NEXT FROM DatabaseCursor INTO @Database
END
CLOSE DatabaseCursor  
DEALLOCATE DatabaseCursor

Sql Server DateTime Veri Tipindeki Datayı Türkçe Formatında Göstermek

  SQL'de tarihleri farklı formatlarda göstermek için FORMAT fonksiyonunu kullanabilirsiniz. Türkçe kısa tarih formatı genellikle "...