Otočení pořadí znaků ve stringu se provede příkazem REVERSE

1
2
3
4
DECLARE @Text nvarchar(200)
SET @Text = 'text ktery chci otočit'
 
SELECT REVERSE(@Text) AS Výsledek

 

Výsledek

Pokud potřebujeme zjistit duplicitu nebo počet stejných hodnot v určitém sloupci, použijeme k tomu jednoduchý fígl s agregační funkcí GROUP BY a "počítadlem" COUNT.

V příkladu zjišťuji počet stejných záznamů ve sloupci BarCode (čárový kód) z tabulky TabKodyZbozi. Tabulka je seřazena dle množství výskytů (funkce ORDER BY)

 

1
2
3
4
select count (BarCode) as PocetVyskytu, BarCode 
from TabKodyZbozi
group by BarCode
order by PocetVyskytu desc 

 

Výsledek

 

 

 

U větších databází, vytíženějších SQL serverů nebo i špatně navržených programů může vlivem nedostatku výkonu docházet k blokování záznamů na SQL serveru nebo pomalým odezvám. Řešením může být samozřejmě optimalizace dotazů, zvětšení výkonu serveru, přidání RAM, ladění aplikace atd. V určitých případech lze výkonu pomoci i psaním dotazů, které využívají tzv.špinavého čtení. Princip spočívá v tom, že dotaz nečeká na ukončení transkakcí nad čtenými daty (nečeká na dokončení update a insert).

Výhody
V určitých případech může pomoci s rychlostí dotazu. Je méně náročný na paměť.

Nevýhody
Jelikož čteme data, která mohou být aktuálně měněna, není výsledek dotazu 100% relevantní. Používat tento způsob získání dat je tedy na pováženou a rozhodně to chce určitou znalost konkrétní databáze potažmo aplikace. 

Kupříkladu, když budete psát dotaz, který ověřuje aktuální množství určité skladové položky, před přenosem do dokladu, je třeba získat přesná data. Zde NOLOCK nepoužívat. Ale když budete zjišťovat, jaká je obrátka této položky za poslední rok, tak bych se tento způsob nebál použít.

 

1
2
3
SELECT Mnozstvi
FROM TabSklad WITH(NOLOCK)
WHERE ....

 

Lze samozřejmě použít i při spojení více tabulek

1
2
3
4
5
SELECT T2.NazevZbozi, T1.Mnozstvi
FROM TabSklad T1 WITH(NOLOCK)
LEFT OUTER JOIN TabKarta T2 WITH(NOLOCK)
  ON T1.IDKarta=T2.ID
WHERE ........

 

 

 

 

 

 

 

 

Tímto skriptem lze importovat data do SQL pomocí příkazu BULK INSERT. Příkaz FIRSTROW není nutné uvádět, ale využívám ho, když je v prvním řádku záhlaví sloupců a to je třeba při importu igronovat.

1
2
3
4
5
6
7
8
BULK INSERT MyTable 
FROM 'C:\cesta\soubor.csv' 
	WITH (
	      FIELDTERMINATOR =',',	--oddělovač dat
              ROWTERMINATOR ='\n',	--ukončení řádku
	      FIRSTROW = 1,		--první řádek importu
              CODEPAGE = 'ACP'          --koódování
	     )          

 

Pro použití v praxi je však většinou třeba zadat cestu k souboru. Tu do procedury zadáme v proměnné. Jelikož je třeba cestu ukládat do uvozovek, nelze použít konstrukci BULK INSERT @Cesta FROM ...  Nejlepší je použít dynamického SQL, celý příkaz vč.cesty vložit do proměnné a tu pak zavolat příkazem EXEC.

 

Zde je kompletní příklad, který v praxi používám (lze vychytat dalším vkládáním proměnných např. pro separátor, atd)

 Vytvoření tabulky

1
2
3
4
5
6
7
CREATE TABLE #TestImport			
	(
	Jmeno		nvarchar(50),                          
	DatumNar	datetime,
	Vek		int,
	Bydliste	nvarchar(100)
	)

 

Vytvoření csv souboru data.csv a uložení do adresáře C:\TestData (lze samozřejmě použít i UNC cestu třeba na serveru, ale SQL musí tento soubor vidět stejnou cestou jako program, který volá proceduru a do proměnné vkládá cestu)

 

Skript pro import dat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DECLARE 
 @Path nvarchar(MAX),
 @SQL nvarchar(MAX)
 
SET @Path = 'C:\TestData\data.csv'
 
SET @SQL = 'BULK INSERT #TestImport 
		FROM ''' +@Path+''
		   WITH (
			 FIELDTERMINATOR ='','',
			 ROWTERMINATOR =''\n'',
			 FIRSTROW = 1,
                         CODEPAGE = ''ACP''
			)'
 
EXEC (@SQL)

 

 Výsledek

 

Ještě je nutno podotknout, že daný uživatel musí mít na SQL práva bulkadmin

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Pokud potřebujete s datem pracovat jako s textovým řetězcem, je třeba jej přetypovat (změnit datový typ). To můžete provést buď funkcí CAST nebo CONVERT.

1
SELECT CAST(Vstup AS DatovyTyp(delka))

Příklad

1
2
3
4
DECLARE @Dnes datetime
SET @Dnes = GETDATE()
 
SELECT CAST(@Dnes AS nvarchar(20))

Výsledek

 

Při použití funkce CONVERT lze určit formát datumu.

1
SELECT CONVERT(DatovyTyp(delka), Vstup, Format)

Pro příklad uvedu 3 typy

1
2
3
4
5
6
7
8
DECLARE @Dnes datetime
SET @Dnes = GETDATE()
 
SELECT CONVERT(nvarchar(20), @Dnes, 104)  
union 
SELECT CONVERT(nvarchar(20), @Dnes, 106)
union 
SELECT CONVERT(nvarchar(20), @Dnes, 108)

Výsledek

Přetypování lze samozřejmě použít (spíše je nutné)  při sčítání řetězců

1
SELECT 'Dnes je: ' + CONVERT(nvarchar(20), GETDATE(), 104)  

Text lze zpátky přetypovat na datum. S datem v textové formě nelze dále pracovat jako s datem, ale jen jako s textem a tom může být nežádoucí.

1
SELECT CONVERT(datetime, '15.11.2017',104)

 

Zde je script pro výpis možností přetypování datumu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
DECLARE @Dnes datetime
SET @Dnes = GETDATE()
SELECT CONVERT(nvarchar(MAX), @Dnes, 0) AS Vystup, 0 AS Styl 
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 1), 1
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 2), 2
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 3), 3
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 4), 4
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 5), 5
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 6), 6
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 7), 7
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 8), 8
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 9), 9
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 10), 10
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 11), 11
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 12), 12
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 13), 13
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 14), 14
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 20), 20
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 21), 21
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 22), 22
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 23), 23
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 24), 24
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 25), 25
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 100), 100
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 101), 101
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 102), 102
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 103), 103
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 104), 104
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 105), 105
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 106), 106
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 107), 107
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 108), 108
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 109), 109
UNION SELECT CONVERT(nvarchar(MAX), @Dnes, 110), 110
ORDER BY Styl ASC

 

 

 

 

 

 

 

 

 

Původně to měla být kategorie o cestách, které podniknu na svém starém kole-dědkovi. Pak se mě název zalíbil a říkám si, že jednou budu taky dědek, vlastně syna už na to mám dost velkýho, a tak nadčasově tuto kategorii nechám pojmenovanou takto. Takže zde nalezneš zápisky z cest. 

Zde je můj blog o SQL. Je to takový můj tahák.

Moje poznámky z instalací