PROCEDURE kısaltması PROC
TRANSACTION kısaltması TRANS
EXECUTE kısaltması EXEC
Demek ki
EXECUTE = EXEC
eğer parametresiz bir SQL cümlesi ise EXEC '....' ya da EXEC @sqlCumlesi
Eğer sql cümleniz: >
'SELECT TOP(@iTopIN) @soyadiOut=soyadi FROM @tabloAdiIN WHERE adi=@kullaniciAdiIN'ise
@iTopIN, @tabloAdiIN ve @kullaniciAdiIN diye 3 parametre girdi parametresi
@soyadiOUT ise çıktı (OUT|OUTPUT) parametresi.
Böyle bir dinamik SQL ifadesini aşağıdaki örnekteki gibi hazırlayabilirsiniz.
Eğer SQL ifadenizde parametre ifadeleriniz varsa
EXEC(@sqlIfadeniz) şeklinde parentezli olarak çalıştırmalısınız.
DECLARE @tabloAdi sysname; DECLARE @SQL nvarchar(500); DECLARE @ParmDef nvarchar(500); DECLARE @count int; SET @tabloAdi = '[dbo].[Birimler]'; SET @SQL = N'SELECT @cnt=COUNT(1) FROM '+@tabloAdi+';' SET @ParmDef = N' @tbl sysname, @cnt int OUTPUT'; EXECUTE sp_executesql @SQL, @ParmDef, @tbl = @tabloAdi, @cnt=@count OUTPUT; SELECT @count;Aşağıdaki kaynak kodu LOG kayıtlarımızı taşımak için yazdığımız bir SQL JOB.
DECLARE @kaynak VARCHAR(50)
DECLARE @hedef VARCHAR(50)
DECLARE @aktarilan INT
DECLARE @silinen INT
DECLARE @tblOzet TABLE
(
id int IDENTITY(1,1),
kaynak VARCHAR(50),
hedef VARCHAR(50),
aktarilan int,
silinen int
);
DECLARE cr CURSOR FOR SELECT kaynakTabloAdi, hedefTabloAdi FROM medula_V3_test_test_log.dbo.TasinacakTablolar
OPEN cr
FETCH NEXT FROM cr INTO @kaynak, @hedef
WHILE @@FETCH_STATUS = 0
BEGIN
print @kaynak+' - '+@hedef
-- 1. Kaynakta şu an kaç aktarılacak satır var (COUNT)
-- 2. Hedefe TOP(COUNT) kayıdı, kaynaktan SELECT ile INSERT et
-- 3. Kaynaktaki TOP(COUNT) kayıdı sil
-- 4. Özet durum mesajı hazırla
/*
| KAYNAK | HEDEF | AKTARILAN | SİLİNEN |
|---|---|---|---|
| @kaynak | @hedef | @aktarilan | @silinen |
Sonuç:
Taşınacak tabloların tutulduğu tablo:
Son Hali
DECLARE @kaynakVeritabani VARCHAR(50)
SET @kaynakVeritabani = 'medula_V3_test';
DECLARE @hedefVeritabani VARCHAR(50)
SET @hedefVeritabani = 'medula_V3_test_test_log';
-- @mailBody : Gönderilecek iletinin gövdesini oluşturacak
DECLARE @mailBody NVARCHAR(MAX)
-- @tr : Gönderilecek iletinin tablosundaki satırı oluşturmak için
DECLARE @tr NVARCHAR(1000)
DECLARE @kaynak VARCHAR(50)
DECLARE @hedef VARCHAR(50)
DECLARE @aktarilan INT
DECLARE @silinen INT
DECLARE @tblOzet TABLE (id int IDENTITY(1,1), kaynak VARCHAR(50), hedef VARCHAR(50), aktarilan int, silinen int);
DECLARE cr CURSOR FOR SELECT kaynakTabloAdi, hedefTabloAdi FROM medula_V3_test_test_log.dbo.TasinacakTablolar
OPEN cr
FETCH NEXT FROM cr INTO @kaynak, @hedef
WHILE @@FETCH_STATUS = 0
BEGIN
-- 1. Hedefteki kayıtları, kaynaktan SELECT ile hedefe INSERT et
-- 2. Kaynaktaki TOP(@@ROWCOUNT) kayıdı sil ve işlem sonuçlarını özet tabloya INSERT et
-- 3. Kaynaktaki Veritabanı sıkıştırılaracak
-- 4. Özet durum mesajı hazırla
/*
| KAYNAK | HEDEF | AKTARILAN | SİLİNEN |
|---|---|---|---|
| @kaynak | @hedef | @aktarilan | @silinen |
| KAYNAK | HEDEF | AKTARILAN | SİLİNEN |
|---|---|---|---|
| '+@kaynak+' | '+@hedef+' | '+CAST(@aktarilan AS NVARCHAR(10))+' | '+ CAST(@silinen AS NVARCHAR(10))+' |
| Çalışma Tarihi: | ' + GETDATE() + ' |
|---|---|
| Kaynak Veritabanı: | ' + @kaynakVeritabani + ' |
| Aktarılan Veritabanı: | ' + @hedefVeritabani + ' |
| ' + @mailBody + ' | |
İleti Gönderen Uygulamaya göre düzenlenmiş
| Çalışma Tarihi: | Nov 19 2011 12: | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| Kaynak Veritabanı: | medula_V3 | ||||||||
| Aktarılan Veritabanı: | medula_V3_Log | ||||||||
| |||||||||
SON HALİ(çift tırnaklı falan)
DECLARE @kaynakVeritabani VARCHAR(50)
SET @kaynakVeritabani = 'medula_V3';
DECLARE @hedefVeritabani VARCHAR(50)
SET @hedefVeritabani = 'medula_V3_Log';
-- @html : Gönderilecek iletinin tüm HTML yapısı
DECLARE @html VARCHAR(4000)
-- @css : Gönderilecek iletinin style tanımları
DECLARE @css VARCHAR(200)
SET @css ='<link rel=''stylesheet'' href=''http://medula.fresenius.com.tr/OrtakDosyalar/FMedulaLogAktarimIleti.css'' style type=''text/css'' />';
-- @head : Gönderilecek iletinin HEAD kısmı
DECLARE @head VARCHAR(300)
SET @head = '<HEAD>' + @css + '</HEAD>'
-- @body : Gönderilecek iletinin BODY kısmı
DECLARE @body VARCHAR(3500)
-- @aktarimOzet : Aktarımın hangi DB den hangi DB ye ne zaman yapıldı özet başlığı
DECLARE @aktarimOzet VARCHAR(3500)
-- @aktarimSonuc : Aktarım bilgisinin(aktarımı yapılmış tablo adlarının ve aktarılan kayıt sayılarının) <TABLE> içinde gösterimi
DECLARE @aktarimSonuc VARCHAR(3500)
-- @tr : Gönderilecek iletinin tablosundaki satırı oluşturmak için
DECLARE @tr VARCHAR(1000)
DECLARE @iletiKime VARCHAR(200)
SET @iletiKime = 'cem.topkaya@fmc-ag.com'
-- KAYITLAR içinde dönmek için kullanılacak ve aktarılmışların özet bilgilerini tutumak için değişkenler
DECLARE @kaynak VARCHAR(50)
DECLARE @hedef VARCHAR(50)
DECLARE @aktarilan INT
DECLARE @silinen INT
DECLARE @tblOzet TABLE (id int IDENTITY(1,1), kaynak VARCHAR(50), hedef VARCHAR(50), aktarilan int, silinen int);
DECLARE cr CURSOR FOR SELECT kaynakTabloAdi, hedefTabloAdi FROM medula_V3_Log.dbo.TasinacakTablolar
OPEN cr
FETCH NEXT FROM cr INTO @kaynak, @hedef
WHILE @@FETCH_STATUS = 0
BEGIN
-- 1. Hedefteki kayıtları, kaynaktan SELECT ile hedefe INSERT et
-- 2. Kaynaktaki TOP(@@ROWCOUNT) kayıdı sil ve işlem sonuçlarını özet tabloya INSERT et
-- 3. Kaynaktaki Veritabanı sıkıştırılaracak
-- 4. Özet durum mesajı hazırla
/*
<TABLE>
<THEAD><TR>
<TH>KAYNAK</TH><TH>HEDEF</TH><TH>AKTARILAN</TH><TH>SİLİNEN</TH>
</TR></THEAD>
<TBODY>
<TR><TD>@kaynak</TD><TD>@hedef</TD><TD>@aktarilan</TD><TD>@silinen</TD></TR>
</TBODY>
</TABLE>
*/
-- 5. Özet durumu ileti olarak gönder
-- 1.
DECLARE @sql VARCHAR(500)
SET @sql ='INSERT INTO '+ @hedefVeritabani +'.'+ @hedef + ' SELECT * FROM ' + @kaynakVeritabani +'.'+ @kaynak
EXEC(@sql)
SET @aktarilan = @@ROWCOUNT;
-- 2.
SET @sql = 'DELETE TOP(' + CAST(@aktarilan AS NVARCHAR(8)) + ') FROM ' + @kaynakVeritabani +'.'+ @kaynak
EXEC(@sql)
SET @silinen = @@ROWCOUNT;
INSERT INTO @tblOzet VALUES(@kaynak, @hedef, @aktarilan, @silinen);
FETCH NEXT FROM cr INTO @kaynak,@hedef
END
CLOSE cr
DEALLOCATE cr
-- 3. iş DB Sıkıştırma
DBCC SHRINKDATABASE ( @kaynakVeritabani )
-- 4.
SET @aktarimSonuc = '<TABLE border=''1''><THEAD><TR><TH class=''metin''>KAYNAK</TH><TH class=''metin''>HEDEF</TH><TH>AKTARILAN</TH><TH>SİLİNEN</TH></TR></THEAD>';
DECLARE crHtml CURSOR FOR SELECT kaynak,hedef,aktarilan,silinen FROM @tblOzet
OPEN crHtml
FETCH NEXT FROM crHtml INTO @kaynak, @hedef, @aktarilan, @silinen
WHILE @@FETCH_STATUS = 0
BEGIN
IF @aktarilan > 0
BEGIN
SET @tr = '<TR><TD>'+@kaynak+'</TD><TD>'+ @hedef +'</TD><TD class=''rakam''>'+CAST(@aktarilan AS VARCHAR(10))+'</TD><TD class=''rakam''>'+ CAST(@silinen AS VARCHAR(10))+'</TD></TR>'
SET @aktarimSonuc = @aktarimSonuc + @tr
END
FETCH NEXT FROM crHtml INTO @kaynak, @hedef, @aktarilan, @silinen
END
CLOSE crHtml
DEALLOCATE crHtml
SET @aktarimSonuc = @aktarimSonuc + '</TBODY></TABLE>';
-- 5. Adım İleti gönderme
SET @aktarimOzet = '<TABLE><CAPTION>LOG TAŞIMA ÖZETİ</CAPTION><TR><TH class=''metin''>Çalışma Zamanı : </TH><TD>' + CAST(GETDATE() AS VARCHAR(25)) + '</TD></TR><TR><TH class=''metin''>Kaynak VT: </TH><TD>' + @kaynakVeritabani + '</TD></TR><TR><TH class=''metin''>Hedef VT: </TH><TD>' + @hedefVeritabani + '</TD></TR><TR><TD COLSPAN=''2''>' + @aktarimSonuc + '</TD></TR></TABLE>';
SET @body = '<BODY>' + @aktarimOzet + '</BODY>';
SET @html = '<HTML>' + @head + @body + '</HTML>';
--print @html
DECLARE @args VARCHAR(4000)
SET @args = 'Q:\SendMail\caSendEmailAlert.exe /sbj:["Log Taşıma"] /html /to:'+ @iletiKime +' /body:["' + @html + '"]'
--print @args
EXEC xp_cmdshell @args


