Podstawowe polecenia w SQL Server

Podczas pracy z SQL Server niezbędne wg mnie są następujące polecenia:

1. Wyszukiwanie treści w bazie:

select o.name
from sys.sql_modules c
join sysobjects o on c.object_id = o.id
where [definition] like '%%'

2. Procent przebudowania indeksów w bazie:

;WITH cte AS
(
SELECT
object_id,
index_id,
partition_number,
rows,
ROW_NUMBER() OVER(PARTITION BY object_id, index_id, partition_number ORDER BY partition_id) as rn
FROM sys.partitions
)
SELECT
   object_name(cur.object_id) as TableName,
   cur.index_id,
   cur.partition_number,
   PrecentDone =
      CASE
         WHEN pre.rows = 0 THEN 0
      ELSE
         ((cur.rows * 100.0) / pre.rows)
      END,
   pre.rows - cur.rows as MissingRows
FROM cte as cur
INNER JOIN cte as pre on (cur.object_id = pre.object_id) AND (cur.index_id = pre.index_id) AND (cur.partition_number = pre.partition_number) AND (cur.rn = pre.rn +1)
ORDER BY 4

3. Aktualnie wykonujący się blok kodu w danej sesji:

select QueryText = SUBSTRING(st.text, (re.statement_start_offset/2)+1,         
       ((CASE re.statement_end_offset
          WHEN -1 THEN DATALENGTH(st.text)
         ELSE re.statement_end_offset
         END - re.statement_start_offset)/2) + 1)
from sys.dm_exec_requests re with (nolock)
CROSS APPLY sys.dm_exec_sql_text(re.sql_handle) AS st
where re.session_id = 1234

4. Wypisywanie aktualnie wykonywanej operacji bez oczekiwania na zakończenie się całej procedury:

declare @Date date ='2015-01-16';
declare @DateStr varchar(100);
while(@Date < cast(getdate() as date))
begin
 set @DateStr = cast(@Date as varchar);
 Raiserror(@DateStr,0,1) with nowait
 --tutaj operacje z jakimiś datami
 set @Date = dateadd(day,1,@date);
end

5. Przykład wykorzystania ROW_NUMBER() do wyeliminowania duplikatów danych:

create table #fox_table  (ID bigint)

insert into #fox_table(ID) values (1);
insert into #fox_table(ID) values (1);
insert into #fox_table(ID) values (1);
insert into #fox_table(ID) values (1);
insert into #fox_table(ID) values (5);
insert into #fox_table(ID) values (5);
insert into #fox_table(ID) values (5);

;with duplicates as
(
 select ID, ROW_NUMBER() over (partition by ID order by ID) as RowNum
 from #fox_table with (nolock)
)
delete from duplicates where RowNum > 1;

select * from #fox_table

drop table #fox_table

Windows Service – wprowadzenie

Usługa Windows – proces wykonywany wewnątrz środowiska systemowego Windows, przeznaczony do specjalnych funkcji i niewymagający interakcji z użytkownikiem komputera. Proces taki nazywany jest też serwisem Windows. Usługa zwykle jest uruchamiana podczas startu (ładowania) systemu operacyjnego i działa tak długo, jak długo system jest czynny.

Tyle z wiki. Warto wejść w link i przeczytać pozostałe informacje.

W dzisiejszej części wykonamy banalny serwis windowsowy.

W naszym Visual Studio wybieramy kolejno File -> New -> Project i wybieramy projekt serwisu windowsowego zgodnie z poniższym schematem:

Windows Service Project start

Create Windows Service Project

Otrzymamy projekt z klasą Service1.cs (ja osobiście zmieniam jej nazwę bo mnie ta drażni), który zawiera w sobie m.in. dwie nadpisane metody:

OnStart (logika wykonywana po uruchomieniu serwisu) i OnStop (logika wykonana przy zamykaniu serwisu).
Naszym zadaniem jest wykonanie jakiegoś ciekawego kodu w tych miejscach i nie tylko w tych 🙂
Co możemy zrobić? Wszystko!
Wysyłać powiadomienia na Skype, mail, SMS.
Wykonywać operacje na bazie danych.
Sprawdzać dostępność jakiś usług. itp.itd…

My przykładowo w OnStart umiejścimy logikę odpowiedzialną za wysyłanie maila, oczywiście drogi czytelniku, możesz zmodyfikować kod i np. utworzyć Timer, który co określony interwał będzie odpytywał zadany adres sieci Web o jakieś dane (i dopiero po pobraniu tych danych wysyłać maila). Tutaj nie będziemy implementować jakiegoś wyszukanego problemu.

Dodajmy poniższy kod do OnStart:

MailMessage message = new MailMessage();
message.From = new MailAddress("Jakiś adres email", "Wyświetlana nazwa");
message.To.Add(new MailAddress("mail, na który zostanie wysłana wiadomość"));
message.Subject = "Tytuł wiadomości";
message.Body = "Treść wiadomości";

SmtpClient smtp = new SmtpClient("adres smtp naszej poczty");
smtp.UseDefaultCredentials = false;
smtp.Credentials = new NetworkCredential("email", "hasło");
smtp.EnableSsl = true;
smtp.Port = 587; //Taki jest dla WP
smtp.Send(message);

Tyle wystarczy by wystartować serwis, więc dajemy! Zmieniamy z Debug na Release i wciskamy F5 i co?
I gówno… 🙂
Otrzymamy komunikat:

--------------------------- Błąd uruchomienia usługi systemu Windows --------------------------- Nie można uruchomić usługi z wiersza polecenia lub z debugera. Usługa systemu Windows musi być najpierw zainstalowana (przy użyciu pliku installutil.exe), a następnie uruchomiona za pomocą Eksploratora serwera, Narzędzi administracyjnych usług systemu Windows lub polecenia NET START. --------------------------- OK    ---------------------------

Błąd uruchomienia usługi systemu windows

Otóż tak jest, iż nie uruchomimy ani nie zdebugujemy (w domyślnej konfiguracji) naszego serwisu. Debugowanie serwisu pokażę w następnym wpisie.

Teraz przejdźmy do rejestracji serwisu.

Na maszynie, na której chcemy zarejestrować nasz serwis otwieramy Wiersz polecenia (cmd) jako administrator i wpisujemy:

sc create MyFirstService binPath= "ścieżka do zbudowanego przez nas serwisu" DisplayName= "Mój pierwszy serwis" start= auto

To wszystko, mamy już gotowy serwis, który będzie uruchamiał się automatycznie. Inne możliwości konfiguracji pod linkiem.
W kolejnej części pokaże jak można debugować usługę sieciową.

 

Poniżej jeszcze najprzydatniejsze polecenia (uruchamianie z CMD jako admin):
sc queryex NazwaUsługi – zwraca informacje o usłudze w tym jej numer PID
taskkill /f /pid NR_PID – ubija serwis, którego nie można zatrzymać – bardzo przydatne polecenie.