Vánoční SQL překlepy

Posted: 22.12.2010 in MS SQL
Štítky:, , , ,

Jak už to bývá, dělá se nejvíce chyb v těch nejjednodušších věcech, které jsou “přeci každému úplně jasné”. Takovou samozřejmostí je např. vytváření aliasů (klauzule AS). MS SQL Server je schopen zpracovat opravdu vše, na co si jen může čtenář při způsobech přejmenování vzpomenout a určitě ještě něco navíc:

image(Pro demostraci bylo použito číslo 1, při výběru sloupce z tabulky již tolik možností  na alias není.)

Takže se asi shodneme, že ve vytváření aliasů se nejspíš nedá udělat chyba. Mám tedy pro vás kontrolní otázku: 
Co vrátí dotaz SELECT COUNT(*) Table_A?
Asi vás prvně trkne, že tam chybí klauzule FROM. To je záměr, berme to jako chybu vzniklou kopírováním. Tento dotaz se korektně spustí.

image

Navrátí sloupec pojmenovaný Table_A s jedním řádkem s hodnotou 1. Pokud uděláte takovouto chybu např. vkopírováním ve složitějším dotazu, budete ji jen těžce odhalovat.

Jelikož se jazyk SQL velice podobá běžné řeči, vznikají chyby výmýšlením si nových příkazů či pouze překlepem:

SELECT * FROM Table_A
UNIONWITH
SELECT * FROM Table_B

Takovýchto novotvarů zvláště u nerodilých mluvčích vzniká celkem dost, příkladem: UNION x ONION x UNIONWITH, INTERSECT x INTERCEPT x INTERSECTWITH atd.
Ještě jsme si neuvedli, co bude výstupem výše uvedeného příkazu. Původně to mělo být sjednocení dvou tabulek pomocí UNION, nyní jsou výsledkem 2 tabulky: tabulka Table_A dostala alias UNIONWITH a druhá se nadále jmenuje Table_B. Tato jména ale ve výpisu neuvidíme, o co je to zrádnější.

image

Obrana proti těmto chybám bohužel neexistuje kvůli až příliš benevolentnímu zpracování SQL/T-SQL kódu. A na obarvování u IntelliSence se bohužel také nemůžeme 100% spolehnout Sad smile

Napsat komentář

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Změnit )

Twitter picture

You are commenting using your Twitter account. Log Out / Změnit )

Facebook photo

You are commenting using your Facebook account. Log Out / Změnit )

Connecting to %s