Sayfalar

30 Ekim 2014 Perşembe

SQL - FETCH – CURSOR YAPISI


CURSOR NEDİR ?

Veri tabanı nesneleri içinde; kayıtlar arasında , satır bazlı hareket etmemizi sağlayan mekanizmadır.
- Bu sayede , istediğimiz bir satıra hareket ederek sonucunu alabiliriz.
- Aktif kaydı tespit edebiliriz.
- Aktif kayıtta değişiklik yapabiliriz.
- Script , Stored Prodecure ve Trigger yapılarında kullanabiliriz.
- Transact- SQL ifadeleri ile bir Cursor oluşturabileceğimiz gibi Database API fonksıyonlarını da kullanabiliriz.Bu Database API fonksiyonları olarak ADO , OLEDB ve ODBC yapılarını tercih edebiliriz.

FETCH ve DİĞER ÖZELLİKLER:

Satır hareketlerini yöneten , bir Cursor ifadesidir.
-Fetch First : İlk satıra gider.
-Fetch Next : Bir sonraki satıra gider.
-Fetch Prior : Bir önceki kayıda gider.
-Fetch Last : Bir sonraki kayıda gider.
-Fecth ABSOLUTE n: Burada “n” olarak ifade edilen sayılsal bir değerdir ve kaç kayıt gidileceğini belirler.ABSOLUTE ifadesi;bu kayıt hareketlerinin her zaman ilk kayıttan başlamasını sağlar.

Fetch RELATIVE n : Yukarıdaki ifadeden farklı olarak,kayıt ilerleme miktarını o an bulunan kayıda göre yapar.

Ayrıca Cursor içinde kullanılan Forward-Only ifadesi ile sadece ileri gitme işlemi gerçekleştirilir.Bu yapıda salt Fetch Next çalışır.Eğer tüm Fetch özelliklerini kullanmak istersek ; Scrollable yapısını tercih etmemiz gerekir.Bu,tüm Fetch seçeneklerini destekler.(Sadece Dynamic Cursor ile beraber Fetch Absolute kullanımına destek vermez.)

Bir Cursor OPEN ifadesi ile açılırken , CLOSE ifadesi ile de kapanır.

Örnekler;

USE ("Databese adı")
GO

DECLARE (Tablo adı) CURSOR FOR
SELECT (Alanlar)
FROM (Tablo adı)
ORDER BY AGE ASC

OPEN (Tablo adı)
FETCH NEXT FROM (Tablo adı)
WHILE @@FETCH_STATUS=0
BEGIN
FETCH NEXT FROM (Tablo adı)
END

CLOSE (Tablo adı)
DEALLOCATE (Tablo adı)

SQL de database bağlantılarını görüntüleme

 SELECT spid ProcessId, blocked as kilitleyenId, waittime/1000 as BeklemeSuresi_sn,
                    hostname,cmd, loginame,nt_username,program_name, *
                    from master.dbo.sysprocesses
                    where spid > 50
                    and dbId=(Select database_id from master.sys.databases where name='YORUKOGLU2014' )
                    --and blocked > 0 (istersek sadece database i kilitleyen bağlantıları görebiliriz)
                    order by  master..sysprocesses.spid desc, master..sysprocesses.waittime desc

27 Ekim 2014 Pazartesi

SQL DATETIME FORMATS

  1. SELECT convert(datetime, 'Oct 23 2012 11:01AM', 100) -- mon dd yyyy hh:mmAM (or PM)
  2. SELECT convert(datetime, 'Oct 23 2012 11:01AM') 
  3. SELECT convert(datetime, 'Oct 23 12 11:01AM', 0) -- mon dd yy hh:mmAM (or PM)
  4. SELECT convert(datetime, 'Oct 23 12 11:01AM') 
  5. SELECT convert(datetime, '10/23/2016', 101) -- mm/dd/yyyy
  6. SELECT convert(datetime, '2016.10.23', 102) -- yyyy.mm.dd
  7. SELECT convert(datetime, '23/10/2016', 103) -- dd/mm/yyyy
  8. SELECT convert(datetime, '23.10.2016', 104) -- dd.mm.yyyy
  9. SELECT convert(datetime, '23-10-2016', 105) -- dd-mm-yyyy
  10. SELECT convert(datetime, '23 OCT 2016', 106) -- dd mon yyyy
  11. SELECT convert(datetime, 'Oct 23, 2016', 107) -- mon dd, yyyy
  12. SELECT convert(datetime, '20:10:44', 108) -- hh:mm:ss
  13. SELECT convert(datetime, 'Oct 23 2016 11:02:44:013AM', 109
  14. SELECT convert(datetime, '10-23-2016', 110) -- mm-dd-yyyy
  15. SELECT convert(datetime, '2016/10/23', 111) -- yyyy/mm/dd
  16. SELECT convert(datetime, '20161023', 112) -- yyyymmdd
  17. SELECT convert(datetime, '23 Oct 2016 11:02:07:577', 113) -- dd mon yyyy hh:mm:ss:mmm
  18. SELECT convert(datetime, '20:10:25:300', 114) -- hh:mm:ss:mmm(24h)
  19. SELECT convert(datetime, '2016-10-23 20:44:11', 120) -- yyyy-mm-dd hh:mm:ss(24h)
  20. SELECT convert(datetime, '2016-10-23 20:44:11.500', 121) -- yyyy-mm-dd hh:mm:ss.mmm
  21. SELECT convert(datetime, '2008-10-23T18:52:47.513', 126) -- yyyy-mm-ddThh:mm:ss.mmm
  22. SELECT convert(datetime, STUFF(STUFF('31012016',3,0,'-'),6,0,'-'), 105)
  23. SELECT convert(datetime, '10/23/16', 1) -- mm/dd/yy
  24. SELECT convert(datetime, '16.10.23', 2) -- yy.mm.dd
  25. SELECT convert(datetime, '23/10/16', 3) -- dd/mm/yy
  26. SELECT convert(datetime, '23.10.16', 4) -- dd.mm.yy
  27. SELECT convert(datetime, '23-10-16', 5) -- dd-mm-yy
  28. SELECT convert(datetime, '23 OCT 16', 6) -- dd mon yy
  29. SELECT convert(datetime, 'Oct 23, 16', 7) -- mon dd, yy
  30. SELECT convert(datetime, '20:10:44', 8) -- hh:mm:ss
  31. SELECT convert(datetime, 'Oct 23 16 11:02:44:013AM', 9)
  32. SELECT convert(datetime, '10-23-16', 10) -- mm-dd-yy
  33. SELECT convert(datetime, '16/10/23', 11) -- yy/mm/dd
  34. SELECT convert(datetime, '161023', 12) -- yymmdd
  35. SELECT convert(datetime, '23 Oct 16 11:02:07:577', 13) -- dd mon yy hh:mm:ss:mmm
  36. SELECT convert(datetime, '20:10:25:300', 14) -- hh:mm:ss:mmm(24h)
  37. SELECT convert(datetime, '2016-10-23 20:44:11',20) -- yyyy-mm-dd hh:mm:ss(24h)
  38. SELECT convert(datetime, '2016-10-23 20:44:11.500', 21) -- yyyy-mm-dd hh:mm:ss.mmm 

SQL DateTime Functions

SQL de kullandığımız bazı Date/Time Function' ları


GETDATE()         Geçerli tarih ve saati döndürür
GETDATE()---> '2014-10-27 15:18:18.043'

DATEPART()      Bir tarih / zamanın tek bir kısmını döndürür
DATEPART(DAY,'2014-10-27 15:18:18.043') ---> 10

DATEADD()        Bir tarihten itibaren belirli bir zaman aralığı çıkarıp ekler
DATEADD(DAY,'10','2014-10-27 15:18:18.043') --->  2014-11-04 00:00:00.000

DATEDIFF()        İki tarih arasındaki zamanını döndürür
DATEDIFF(DATEDIFF(DAY,'10','2014-10-27 15:18:18.043')) ---> 10


CONVERT()        Bir Tarih/zamanın formatını değiştirir
DATEADD(DAY,10,'2014-10-27 15:18:18.043',102) ---> 2014.10.25
 

25 Ekim 2014 Cumartesi

SQL istenilen SQL bağlantısını yoketme silme

DECLARE @v_spid INT
DECLARE c_Users CURSOR
   FAST_FORWARD FOR
   SELECT SPID
   FROM master..sysprocesses (NOLOCK)
   WHERE spid>50 and --blocked>0 and
   dbId=(Select database_id from master.sys.databases where name='user database' )
   and hostname='istemci adı' and loginame='giriş yapan kullanıcı' and program_name='kullanan uygulama'
   --and spid=istenilen sesion ID  --AND status='suspended' --kilitleyen idleri atabiliriz
   --AND DATEDIFF(mi,last_batch,GETDATE())>=60
   AND spid<>@@spid

OPEN c_Users
FETCH NEXT FROM c_Users INTO @v_spid
WHILE (@@FETCH_STATUS=0)
BEGIN
  PRINT 'KILLing '+CONVERT(VARCHAR,@v_spid)+'...'
  EXEC('KILL '+@v_spid)
  FETCH NEXT FROM c_Users INTO @v_spid
END

CLOSE c_Users
DEALLOCATE c_Users

SQL CPU işlem sorgulama

 SELECT spid ProcessId, blocked as kilitleyenId, waittime/1000 as BeklemeSuresi_sn,
                    hostname,cmd, loginame,nt_username,program_name, *
                    from master.dbo.sysprocesses
                    where spid > 50 --and spid=380 --and loginame='orhan' --and  waittime >0
                    and dbId=(Select database_id from master.sys.databases where name='user database' )
                    --and blocked > 0 --(database i kilitleyenleri bu sekme ile görebiliriz.)
                    order by  master..sysprocesses.spid desc, master..sysprocesses.waittime desc

SQL sitrin içinde üstten tırnak sorunu

@degisken= replace(@degisken,'X',char(39))

bu şekilde text te gen istediğimiz veriyi üst tırnağa çevirebiliyoruz

SQL String degeri sabit karakter aralığına göre parçalayıp string döndüren function

Create FUNCTION [dbo].[String_Split](@String varchar(max))  
 RETURNS @tbl TABLE (deger varchar(max) NOT NULL) AS
 BEGIN
 DECLARE @pos        int,
       @nextpos    int,
       @valuelen   int

 SELECT @pos = 0, @nextpos = 1

 WHILE @nextpos > 0
 BEGIN
  SELECT @nextpos = charindex(',', @String, @pos + 1)
  SELECT @valuelen = CASE WHEN @nextpos > 0
                          THEN @nextpos
                          ELSE len(@String) + 1
                     END - @pos - 1
  INSERT @tbl (deger)
     VALUES (convert(varchar, substring(@String, @pos + 1, @valuelen)))
  SELECT @pos = @nextpos
 END
 RETURN
end

SQL String degeri sabit karakter aralığına göre parçalayıp integer döndüren function

CREATE FUNCTION [dbo].[Integer_Split](@String varchar(max))  
 RETURNS @tbl TABLE (number int NOT NULL) AS
 BEGIN
 DECLARE @pos        int,
       @nextpos    int,
       @valuelen   int

 SELECT @pos = 0, @nextpos = 1

 WHILE @nextpos > 0
 BEGIN
  SELECT @nextpos = charindex(',', @String, @pos + 1)
  SELECT @valuelen = CASE WHEN @nextpos > 0
                          THEN @nextpos
                          ELSE len(@String) + 1
                     END - @pos - 1
  INSERT @tbl (number)
     VALUES (convert(int, substring(@String, @pos + 1, @valuelen)))
  SELECT @pos = @nextpos
 END
 RETURN
end

Ms SQL Server

Select * from biliyorsan gerisi kolay :)