MSSQL UPSERT, INSERT INTO ... ON DUPLICATE KEY UPDATE
Programátor MySQL databází přechází na MSSQL. MSSQL je pro mne naprostá novinka a zároveň zděšením. Zatím jsem zelenáč a tak budu popisovat mnoho rozdílů mezi styly programování na které jsem jako programátor MySQL zvyklý.
Prvně mě zklamala kompletní informační základna okolo MSSQL. MSDN Books Online mně přišlo hodně chaotické, ale dá se v tom zoorientovat, avšak na bohaté praktické ukázky použití nebo rozsáhlé příspěvky můžete zapomenout. Podobně je na tom většina internetových zdrojů i tištěných publikací. Internetových diskusí na toto téma je poskromnu a převážně se jedná o nedořešené problémy nebo odpovědi typu: ,,Proč to dělat tak, když to jde i se základy" (jinak řečeno, diskuse je zabitá a ani po třech letech není problém vyřešen, škoda kliknutí v google). Jakýkoli zájem o nějakou optimalizaci žádný, komunita programátorů okolo MSSQL se pravděpodobně soustředí (a to z pochopitelných důvodů) převážně na komerční úrovni a o své problémy se dělí uvnitř firmy.
Jedním z takových problémů jsou běžné SQL dotazy využívané na MySQL, např. INSERT INTO ... ON DUPLICATE KEY UPDATE, zkracovaný někdy jako UPSERT, v některých publikacích je uváděn jako optimalizační metoda, např. v publikaci MySQL - Oficiální průvodce tvorbou, správou a laděním databází (strana 182), tuto metodu zmiňuji i v článku INSERT INTO ... ON DUPLICATE UPDATE, ale co když nechceme, aby se nový záznam vytvořil, ale jen upravil existující?, související diskuse pod článkem však její platnost popírá a proto byla diskuse rozšířena o článek Jeden dotaz do databáze nebo tisíce? ... je to stejné? Tento článek řeší nejužší místo mezi databází a databázovým layerem, zdá se že MySQLi si dokáže celkem úspěšně poradit s tisíci dotazy i položenými zvlášť, ovšem při připojení přes ODBC řešíme znovu stejný problém.
Při hledání alternativy této metody pro MSSQL jsem našel pouze toto řešení:
- IF EXISTS (SELECT * FROM Table1 WHERE Column1='SomeValue')
- UPDATE Table1 SET (...) WHERE Column1='SomeValue'
- ELSE
- INSERT INTO Table1 VALUES (...)
Vhodnější, by mohl být tento přístup:
- UPDATE Table1 SET (...) WHERE Column1='SomeValue'
- IF @@ROWCOUNT=0 INSERT INTO Table1 VALUES (...)
Co na to říkáte? Ještě to tak napsat jako hromadný insert!
komentáře
RSS Komentáře
K té dokumentaci – na MSDN Books Online je výborná, a ještě lepší je její integrace do SQL Server Management Studia.
Každopádně je dobré si koupit i knihu – pokud jsi začátečník, tak třeba „Beginning SQL Server 2008 for Developers“ pro základy, a poté „Pro T-SQL 2008 Programmers's Guide“ pro pokročilé T-SQL funkce, procedury, triggery a další. Oboje je od APressu a z amazon.co.uk ti to doručí do 3 dnů.
Ufff… strankovanie, normalne ma striaslo. To som riesil v MSSQL zhruba pred troma rokmi… No ale mam dojem ze to chceli upravit a tipol by som ze uz to podporuju nejako normalne. Neviem… v sucastnosti som viac robil s MySQL…
Ale moj nazor je, ze MSSQL je podstatne kvalitnejsi software (a to neporovnatelne!) oproti MySQL…



SQL Server 2008 Books Online > MERGE http://technet.microsoft.com/…b510625.aspx