Nie zabłądzisz na manowce, gdy pod ręką masz gotowce – część 1
Ten wpis będzie po trosze prywatą ;). Nazbierało mi się kilka różnych skryptów, zazwyczaj są to pojedyncze polecenia SQL, które warto mieć pod ręką. No właśnie ;). Rzecz w tym, że nie zawsze pod tą ręką są, a tu na blogu praktycznie w 99% przypadków by były. Zatem dzielę się nimi, a przy okazji zapewniam sobie ich większą dostępność dla siebie.
Na początek skrypt wyciągający dość podstawowe informacje, dotyczące użytkownika, aplikacji, której używa, serwera SQL, na którym pracuje, miejsca z którego łączy się do serwera, itd.:
select SESSION_USER, -- np. pokaże "dbo", jeśli użytkownik nim jest (a nie właściwy login) SYSTEM_USER, -- nazwa (login) użytkownika z systemu Windows USER_NAME(), -- np. pokaże "dbo", jeśli użytkownik nim jest (a nie właściwy login) IS_MEMBER('db_owner'), -- czy zalogowany użytkownik jest członkiem grupy "db_owner" DB_NAME(), -- nazwa bazy danych APP_NAME(), -- nazwa aplikacji, która połączył się z SQL Serverem SERVERPROPERTY('MachineName'), -- nazwa komputera, na którym uruchomiony jest SQL Server @@SERVERNAME, -- nazwa SQL Servera (np. nazwa komputera \ nazwa instancji) @@SERVICENAME, -- nazwa instancji HOST_NAME(); -- nazwa komputera, z którego następuje połączenie do SQL Servera
Sposób na sprawdzenie czy tabela istnieje (nazwy nie należy poprzedzać schematem):
declare @tabela varchar(255) = 'MojaTabela'; if object_id(@tabela) is not null select 'tabela istnieje' else select 'brak tabeli';
Czy można sprawdzić istnienie tabeli tymczasowej? Tak, ale trzeba poprzedzić jej nazwę nazwą bazy tempdb:
declare @tabela varchar(255) = '#Tymczasowa'; set @tabela = 'tempdb..' + @tabela; if object_id(@tabela) is not null select 'tabela istnieje' else select 'brak tabeli';
Sprawdzenie czy istnieje kolumna OczekiwanaKolumna w tabeli:
if exists (select * from syscolumns where id = object_id('MojaTabela') and name = 'OczekiwanaKolumna') select 'kolumna istnieje' else select 'brak kolumny';
A jak sprawdzić to samo dla tabeli tymczasowej?
if exists (select * from tempdb..syscolumns where id = object_id('tempdb..#T') and name = 'OczekiwanaKolumna') select 'kolumna istnieje' else select 'brak kolumny';
Zakodowanie kolumny binarnej do base64:
select cast(N'' as xml).value('xs:base64Binary(xs:hexBinary(sql:column("tab.bincol")))', 'varchar(8000)') from (select 0x1234567890 as bincol) tab
Wypełnienie tabeli w pętli + sposób na uzyskanie listy dni miesiąca i tygodnia:
declare @fromDate datetime, @toDate datetime, @X int, @I int, @Date datetime SET DATEFIRST 1 -- ustalenie, że to poniedziałek jest pierwszym dniem tygodnia (aktywne tylko podczas procedury) select @Date = GETDATE()-30, @I = 1 select @fromDate = @Date - Day(@Date) + 1, @toDate = @Date + 32 - Day(@Date + 32) + 1 set @X = Day(@toDate - 1) while @I <= @X begin print Str(@I) + ', ' + Convert(varchar(10), @fromDate + @I - 1, 121) + ', ' + Str(DatePart(dw, @fromDate + @I - 1)) + ': ' + SubString('PnWtŚrCzPtSbNd', DatePart(dw, @fromDate + @I - 1) * 2 - 1, 2) set @I = @I + 1 end
Uzyskanie wyniku zapytania z góry ustalonej listy wartości (podanych literalnie):
select C from (values (1), (2), (3)) Q(C);
Zawsze niepusty wynik zapytania, czyli jeśli zapytanie właściwe (umieszczane w CTE) zwróci pusty wynik, to i tak zostanie zwrócony jeden wiersz danych (wystarczy usunąć top (0) z zapytania, aby zobaczyć jak to działa).
with CTE as ( select top (0) 1 as X ) select * from CTE union all select 0 as X where not exists (select * from CTE);
Przetworzenie wartości z wybranej kolumny tabeli na ciąg tekstowy:
if object_id('tempdb..#T') is not null drop table #T; select C into #T from (values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) Q(C) select -- utworzenie ciągu tekstowego (select ''+Str(C, 1)+',' as "data()" from #T for XML PATH ('')) as Lista;
Przykład PIVOT-a:
if object_id('tempdb..#T') is not null drop table #T; create table #T (id int, Item varchar(50), ValueForPivot varchar(50)); insert into #T values (1, 'alfa', 'red'), (1, 'alfa', 'green'), (3, 'bravo', 'green'), (3, 'bravo', 'blue'), (2, 'charlie', 'white'), (2, 'charlie', 'black'), (2, 'charlie', 'gray'); select id, Item, [1] as FirstValue, [2] as SecondValue from ( select id, Item, ValueForPivot, row_number() over (partition by Id order by ValueForPivot) as LP from #T ) Q pivot (min(ValueForPivot) for LP in ([1], [2])) as X order by id;
Na razie tyle wystarczy, ale nie obiecuję, że kiedyś podobnego wpisu nie popełnię ;).