• 17.9.2019
  • Ing. Jan Zedníček - Data Engineer & Controlling
  • 0

Č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í.

Čárka navíc – Incorrect syntax near the keyword

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.

5/5 - (2 votes)

Ing. Jan Zedníček - Data Engineer & Controlling

Jmenuji se Honza Zedníček a působím jako freelancer. Pracoval jsem dříve také jako BI developer, finanční controller a analytik. Vše pro společnosti z oblasti IT, bankovnictví, consultingu a výroby. Po práci si rád zahraju tenis, volejbal, šachy, zajdu do posilovny a občas neúspěšně odpálím pár balónků v golfu 🏌️

Již cca 10 let zapisuji na tento web různé návody určené zejména odborné veřejnosti, studentům a zájemcům o informace z oblastí Business intelligence, korporátních financí a reportingu.

🔥 Přihlašte se do naší Excel facebook skupiny (2.4k+ členů), kde si pomáháme Excel CZ/SK diskuse »

Leave a Reply

Your email address will not be published. Required fields are marked *