• aaa

    Poznávačka krás Maďarska - toulání po severu 

  • CAT700

    Non-stop adventure závod přes Katalánsko - z Pyrenejí až k moři

  • Toulání Šumavou
    Toulání Šumavou

    Extrémní non-stop MTB závod

  • 1000 miles
    1000 miles

    Non-stop extrémní adventure závod napříč Československem by Jan Kopka

  • Bohemia Divide 2019

    Non-stop bike packing závod 700km dlouhý z nejjižnějšího do nejsevernějšího místa ČR 

A A A

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

 

 

 

 

 

 

 

 

 

Tímto příkazem lze vkládat části řetězce do jiného, popř. při tom smazat určitý počet znaků

1
SELECT STUFF (PuvodniText, PoziceVlozeni, KolikZnakuSmazat, CoVlozit)

Příklad: Text 'Tonda není žádný blbec' potřebujeme změnit

1
SELECT STUFF ('Tonda není žádný blbec',7,10,'je')

Výsledek: Tonda je blbec

Někdy nastane situace, kdy je třeba zpracovat sadu příkazů opakovaně. K tomu lze použít příkaz WHILE.
Pokud je splněna podmínka definovaná za WHILE je zpracován blok příkazů mezi BEGIN a END. Na konci bloku je opět testovaná podmínka a pokud je splněna cyklus probíhá opakovaně. Pokud v průběhu cyklu potřebujeme zpracování ukončit a pokračovat ve zpracování příkazů za cyklem použijeme příkaz BREAK. Naopak, pokud chceme pokračovat dále, použijeme CONTINUE (vzhledem k tomu, že smyčka by beztak pokračovala dále, tak se CONTINUE prakticky nepoužívá)

1
2
3
4
5
6
7
WHILE Podmínka
 
BEGIN
  Příkaz 1
Příkaz 2   ..... END

 

Praktická ukázka i s použitím BREAK

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DECLARE @PocitadloCyklu INT
SET @PocitadloCyklu = 0
 
WHILE @PocitadloCyklu < 10
BEGIN
  PRINT 'Cyklus: ' + CAST(@PocitadloCyklu AS nvarchar)
  SET @PocitadloCyklu = @PocitadloCyklu + 1
  IF @PocitadloCyklu = 8 
    BEGIN
      PRINT 'Přerušení smyčky'
      BREAK
    END	
  ELSE CONTINUE
END

Pozn. Cyklus by měl proběhnout 10x, ale vzhledem k podmínce uvnitř cyklu skončí při 7-mém průběhu

Výsledek:

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í

Search