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