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ę ;).