Selamlar,

Geçenlerde SQL Server Management Studio kurulu olmayan bir pc'de acilen bir stored procedure yüzünden oluşan hatayı düzeltmem gerekti.

Çözüme giden yolda "acaba var mıdır böyle birşey?" sorusunu sorup, kısa bir google sorgulaması sonunda "vaayy. gerçekten varmış. süpermiş!" dedirten; süper, minik, can mı can bir kod(çuk) not ediyorum, sizlere ve kendime...

EXEC sp_helptext N'DatabaseName.dbo.SpName';

Efendim napçaz biz bunu diyenlere: Bunu copy paste yapıp db ve sp adını değiştirip execute ederseniz, ilgili sp'nin create sorgusu karşılayacaktır sizi.

Eeee, ben sp'ye sağ tıklar "Script Stor. Procedure as..." den bunu yapardım zaten diyenlere: Onu her zaman yapamazsınız işte. There is NO Management Studio..

Sende MsSql kurulu değilken bu sorguyu nasıl execute edersin diyenlere: Connection String ve Sorguyu ekrandan alıp execute ettiğim bir web arayüzüm var demek ki. Demek ki istediğim yerden istediğim sorguyu çalıştırabileceğim bir şey yapmışım kendime zamanında :)

Bugün kendimi kimse soru sormadan cevap vermeye programladığım bir günse demek ki.. :) Zaten de işimiz programlamaksa demek ki...

Aşağıdaki sorgu sayesinde fragmentation oranı %5 üzerinde olan tüm indexleri otomatik olarak reorganize edebilir, isterseniz bunu bir sql job sayesinde her gece çalışacak şekilde ayarlayarak index bakım işlemini SQL Server Agent'a bırakabilirsiniz.

Normal şartlarda fragmentation oranı %30 un üzerinde olan indexleri rebuild etmeniz daha sağlıklı olacaktır ancak rebuild işlemi sırasında yeni disk alanına ihtiyaç duyacağınız için rebuild yapmadan önce disk alanını kontrol etmenizde fayda var. Ben rebuild işlemini otomatik olarak yapacağım derseniz ise; aşağıda yer alan sorguda REORGANIZE yerine REBUILD yazmanız yeterli olacaktır...

DECLARE       @DbId INT = DB_ID()

 

SELECT      ROW_NUMBER() OVER(ORDER BY ps.avg_fragmentation_in_percent DESC) AS SiraNo,

            OBJECT_NAME(ps.object_id) as ObjectName,

            i.name as IndexName,

            ps.avg_fragmentation_in_percent, page_count,

            'ALTER INDEX '+i.name+' ON '+OBJECT_NAME(ps.object_id)+' REORGANIZE;' AS Query

INTO        #tmpIndex

FROM        sys.dm_db_index_physical_stats (@DbId,NULL,NULL,NULL,'LIMITED') ps

JOIN        sys.indexes i

            ON    i.object_id =     ps.object_id

            AND   i.index_id  =     ps.index_id

WHERE       ps.avg_fragmentation_in_percent    >     5

            AND ps.index_id                    >     0                

ORDER BY    ps.avg_fragmentation_in_percent DESC

 

 

DECLARE     @Query      NVARCHAR(MAX)

DECLARE     @SiraNo     INT

SET         @SiraNo     =     (SELECT MIN(SiraNo) FROM #tmpIndex)

 

WHILE       (@SiraNo IS NOT NULL)

BEGIN 

      SET   @Query      =     (SELECT Query FROM #tmpIndex WHERE SiraNo = @SiraNo)

      SET   @SiraNo     =     (SELECT MIN(SiraNo) FROM #tmpIndex WHERE SiraNo > @SiraNo) 

      EXEC  (@Query) 

END

 

DROP TABLE  #tmpIndex

 

Sql tarafında ETL, bulk insert, data compare gibi işlemler yaparken string ifadelerin başlarında ve sonlarında yer alan boşluk gibi ifadeler çok can sıkıcı olabiyor çoğu zaman.

Özellikle data, source olarak bir file kullanılarak elde edilmişse; kayıtlarda boşluk dışında enter gibi farklı ifadelerin de yer alma ihtimali yüksektir. Bu tarz verileri akıllıca trimleyebilmek adına son zamanlarda uğraştığım Data Mining Projesinin ETL modülünde kullanmak üzere yazdığım sql function'u sizlerle de paylaşmak istedim.

CREATE FUNCTION   [dbo].[Trim]
(
      @pString    NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
BEGIN 
      DECLARE     @pReturnString    NVARCHAR(MAX)
     
      SET         @pString    =      REPLACE(REPLACE(@pString,CHAR(13),CHAR(32)),CHAR(10),CHAR(32))
 
      WHILE (ISNULL(CHARINDEX(CHAR(32)+CHAR(32),@pString),0)>0)
      BEGIN
            SET   @pString    =     REPLACE(@pString,CHAR(32)+CHAR(32),CHAR(32))
      END     
      IF (@pString IS NULL OR LTRIM(RTRIM(@pString))='')
            SET   @pReturnString    =     NULL
      ELSE
            SET   @pReturnString    =     LTRIM(RTRIM(@pString)) 
      RETURN      @pReturnString 

END 

Örnek Kullanım Şekli ve Outputs

SELECT dbo.Trim(' Erbil Taner Tugaylı ') -->Output: Erbil Taner Tugaylı
SELECT dbo.Trim('   Erbil    Taner     Tugaylı    ') -->Output: Erbil Taner Tugaylı
SELECT dbo.Trim(' Erbil
Taner
Tugaylı ')  -->Output: Erbil Taner Tugaylı

Bu makalede t-sql ile pivot kullanımını göreceğiz. Fakat bunun öncesinde pivot table nedir ve ne amaçla kullanılır bunu bilmekte yarar var.

Hepimizin bildiği gibi bir tablo satırlardan ve sütünlardan oluşan veri kümesidir. Fakat yüzlerce satırdan oluşan bu verilerin kolay analiz edilebilmesi ve bir bakışta bize bir fikir verebilmesi için verileri grafiğe dökme veya bazı kriterlere göre gruplama gibi bazı işlemler yaparız.
Örneğin ay, yıl, adet bilgilerini içeren bir satış tablosunun yıl bazında toplam satış adedini vermesi için yıl bazında gruplanması gibi. Fakat yaptığımız bu gruplama bile bazen binlerce satırlık verinin analiz edilebilmesi için yeterli olmaz. Bu noktada satır sayısını azaltıp sütün saysını çoğaltmak gibi bir method izlenir. Raporlama konu başlığı altında Matris Rapor olarak geçen bu konu, Excel ve Databasede karşımıza Pivot Table olarak[......]