Články pro začátečníky zde na webu mají docela velký úspěch a návštěvnost a proto jsem se rozhodl na ně navázat. I ten nejlepší profík v jakémkoliv oboru někdy začínal a ze začátku dělal chyby. S úplnými základy SQL (není potřeba mít předchozí znalosti) se můžete seznámit v článcích:
U psaní prvních SQL skriptů budete na 100 % dělat chyby, než se naučíte ty správné automatismy. Chyby jsou přirozenou součástí učení. Často uděláte chybu z nepozornosti a ztratíte nějaký čas a nervy zjišťováním co vlastně máte blbě. Někdy vás na chybu nasměruje chybová hláška v SQL klientovi, někdy ne.
Proto jsem se rozhodl udělat seznam nejčastějších chyb na které časem určitě narazíte. Zkuste si tyto chyby zapamatovat a až ji někdy uděláte, budete vědět odkud vítr vane 🙂
Některých chyb se dá do budoucnu vyvarovat správnými návyky při psaní kódu – SQL Přehledně zformátovaný kód – Chováme se ke kolegům zodpovědně! – přehledným kódem, ve kterém na první pohled vidíme co se děje, můžeme chybám předcházet velmi účinně.
SQL Skript pouštíme nad špatnou databází – Invalid object name
Častou chybou je to, že se pokoušíme přes SQL skript dotazovat do neexistujícího objektu. Totiž dotazujeme se nad databází , kde se daný objekt nenachází.
V našem případě bychom chtěli provést dotaz do tabulky “Priklad”, která se nachází v databázi [Temp]. My však stojíme nad jinou databází a proto výsledkem skriptu bude chyba.
Msg 208, Level 16, State 1, Line 3
Invalid object name ‘dbo.Priklad’.
Této chyby se do budoucna zcela vyvarujeme tím, že si zvykneme používat ve skriptech kompletní cestu na objekt v klauzuli FROM. To znamená [Databáze].[schéma].[objekt]. Používat kompletní cestu při definování objektů je dobrý návyk zejména pro vývojáře
Překlepy v SQL klauzulích nebo názvech objektů – Invalid object name/syntax
To se stává docela často a nejen u začátečníků. Chyba u názvu objektu se dá lehce objevit, protože z chybové hlášky se dá lehce pochopit co se stalo, např.
Msg 208, Level 16, State 1, Line 3
Invalid object name ‘Temp.dbo.Prikla’.
Překlep můžeme udělat i jinak, třeba v klauzuli nebo se nám podaří do skriptu vepsat omylem nějaký znak.
Msg 102, Level 15, State 1, Line 6
Incorrect syntax near ‘Temp’.
Každy dělá překlepy různě často. Úplně se jich vyvarovat nemůžeme. Důležité je ale být schopen chybu brzy najít a opravit. Ve skriptu viz výše je to jednoduché – je krátký. U delších skriptů je klíčová přehlednost, pak se chyby daleko lépe hledají.
Možná jste si všimli, že jednotlivé sloupce vždy odděluji čárkami na dalším řádku. Má to svůj důvod a jedná se o správný návyk při psaní kódu. SQL skripty se často musí ladit nebo v budoucnu revidovat/opravovat – často některé sloupce chceme zakomentovat.
Pokud budeme jednotlivé sloupce oddělovat čárkou tímto způsobem a následně budem chtít sql sloupec zakomentovat, tak budeme muset vložit komentovací znak 2x (před čárku a před sloupec na dalším řádku). To je u velkých skriptů otravné a způsobuje to riziko chyb.
Msg 156, Level 15, State 1, Line 6
Incorrect syntax near the keyword ‘FROM’.
Správný návyk:
Správně se jednotlivé sloupce oddělují před názvem slupce na dalším řádku. Pokud pak chceme sloupec zakomentovat, tak je to mnohem snažší.
Chyby v logických operátorech AND a OR – (ne)používání závorek
Tyto chyby jsou nebezpečné neboť nezpůsobí error, ale jiný výsledek skriptu než očekáváme. Jedná se o kombinaci různých podmínek “a současně” (AND), “nebo” (OR) a jejich různých kombinací. Výsledkem skriptu je pak naprosto jiná množina záznamů než chceme.
Při složitějších podmínkách je potřeba být obezřetný a několikrát si skript zkontrolovat a v případě potřeby doplnit závorky – je rozdíl
- [podmínka_1] AND [podmínka_2] OR [podmínka_3] AND [podmínka_4] AND [podmínka_5]
- (([podmínka_1] AND [podmínka_2]) OR ([podmínka_3] AND[podmínka_4])) AND [podmínka_5]
Nepoužívání aliasů při joinech vede k chybě Ambiguous column name
Použivání aliasů jednotlivých joinů je opět správný návyk, který eliminuje spoustu potenciálních chyb. Častou chybou, která vzniká ve skriptech s joiny je to, že se například sloupec přes který tabulky spojujeme jmenuje stejně.
SELECT
*
FROM [Temp].[dbo].[Priklad]
JOIN [Temp].[dbo].[Priklad_2]
ON [Datum] = [Datum];
výsledkem je pak chyba, protože SQL Server vlastně neví co má s čím spojit => neví ke které tabulce má sloupce Datum přiřadit
Msg 209, Level 16, State 1, Line 7
Ambiguous column name ‘Datum’.
Msg 209, Level 16, State 1, Line 7
Ambiguous column name ‘Datum’.
Jiná situace vzniká pokud použijeme alias
SELECT
*
FROM [Temp].[dbo].[Priklad] [tab_1]
JOIN [Temp].[dbo].[Priklad_2] [tab_2]
ON [tab_1].[Datum] = [tab_2].[Datum]
Podobná chyba vznikne, pokud se pokusíme vyjmenovat do SELECT klauzule sloupce, jejich název je stejný v obou tabulkách. V select klauzuli je tedy potřeba alias používat také.
Když nebudete mít co dělat vyzkoušejte si SQL kvíz pro začátečníky.