Az SQLCMD

Az SQL 2005 egyik legpompásabb találmánya számomra kliensoldalon az SQLCMD vagy sqlcmd, attól függ, hol nézzük. Mostanában nagyon sok olyan munkát végzek, amit próbálok automatizálni, de még így is nagyon sok marad belőle (ezért nem írok blogot, mert gyakorlatilag másfél műszakban dolgozom). Ennek kapcsán kezdtem el jobban használni, kihasználni a sqlcmd lehetőségeit.

Sok Windows-on szocializálódott ember idegenkedik a karakteres képernyőtől, mert nehézkes meg nem lehet kattogtatni benne. Én meg szeretem, mert könnyebb félrekattintani, mint elgépelni (aki nem hiszi, az gondolja végig, hogy dobott-e már be egy foldert egy másikba tervei ellenére grafikus felületen, csak mert megcsúszott az egér). De kezdjük a hibrid oldalon: a Management Studio tud olyat, hogy a query window-t SQLCMD módban futtatja.


Ha bekattintjuk ezt, akkor… nem változik meg semmi igazából, gyakorlatilag ugyanúgy használhatjuk tovább azt az ablakot, mint addig, de most már elfogadja az sqlcmd speciális parancsait. Ezek közül a legalapvetőbb (én ezt használom a leggyakrabban) a connect:

select @@servername
:connect MASIKSQLSERVER
select @@servername
go
select @@servername

Így nem kell kattogtatnom egy csomót, hogy valami egyszerű parancsot lefuttassak a másik szerveren, meg nem hagyok nyitva 120 kapcsolatot magam után, mert az így futtatott parancsok a parancs lefutása után kilépnek a másik gépről, és visszatérünk az eredeti gépre, ahova eredetielg kapcsolódott az ablakunk. Ha például replikációval dolgozunk, akkor kiválóan lehet így összehasonlítani az adatokat-sémákat a gépeken, ugyanazt a lekérdezést futtathatjuk mindkét gépen, csak néha kijelöljük futtatásra a :connect kezdetű sort is, néha meg nem. Apropó, replikáció: anno amikor egy nagyon publikált-replikált adatbázist migráltunk, akkor sqlcmd scripttel tettük át a replikációt az újra, hiszen nagyon rövid idő alatt elég sok és sok article-t tartalmazó publikációt kellett lérehozni, plusz még fel is iratkoznia rá három szervernek, és még a sorrend is számít, hiszen nem irathatom fel a subscribereket mielőtt létrehoznám a publikációt – viszont publikációnként haladtunk, hogy könnyebbe ntudjunk hibát keresni. Kézzel kattogtatva körülbelül egy munkanap lett volna, így 10 perc alatt futott le az egész.

Egy dologra érdemes figyelni az sqlcmd-nél: ha több szerverhez is akarunk csatlakozni, akkor pakoljuk a batch szeparátorokat, azaz a GO-kat a :connect utasítások elé, különben nagyon érdekes és kellemetlen élményben lesz részünk:

-- most SERVER1-en vagyunk
print @@servername
-- GO
:connect SERVER2
print @@servername
-- GO
:connect SERVER3
print @@servername

Erre azt várnánk, hogy kiírja sorban, hogy
SERVER1
SERVER2
SERVER3
De nem. Kiírja, hogy
SERVER1
SERVER2
SERVER2
Bezzeg, ha telegózzuk, hogy Grétsy tanár urat megríkassam, akkor hirtelen javul a helyzet (vagyis vegyük ki a kommenteket a GO-k elől a scriptben). Ismét egy hely, ahol a GO a barátunk.

De nemcsak connect van, hanem egyéb mókák is. Ugye SQL 2005-ben a gonosz SSIS megette a kicsi, könnyű, gyors DTS-t, és nagy cápa lett belőle. Egyetlen szerencsétlen tizenötsoros riport lehúzásához egy atomrakétát beindítani mindig fájdalmas. Szóval az ember nekiáll, megírja a lekérdezést, aztán azt mondja, hogy ezt most fájlba mentsük, és akkor van egy textfájlja végre. De ehhez azért kellett itt-ott állítgatni. Az sqlcmd mode meg ilyen:

:out x:\export.txt
set nocount on
select top 10 * from dbo.t1

Hát nem csodálatos? Az output fáljba a text output beállításnak megfelelően tolja ki az adatokat, tehát alapból fix oszlopszélességgel (figyelem, ha átállítjuk CSV-re, akkor új ablakot kell nyitnunk, hogy élvezhessük a változást).

Hát dióhéjban ennyit az SQLCMD mode-ról, az sqlcmd jóval több, mint ez, hiszen ha scriptesen közelítjük meg a dolgot, sokkal több opciónk lesz, plusz használhatunk változókat a scriptekben, az sqlcmd.exe visszatérési kódját beállíthatjuk SQL lekérdezéssel, sőt, szerkeszthetjük nagyon kényelmesen egy teljesablakos editorban a többsoros lekérdezéseinket interaktív módban. De erről majd később.

Leave a comment