Tegnap megtartottam életem első prezentációját a PowerShell és az SQL kapcsolatáról. És túléltem :) A helyszínt a LogMeIn biztosította, a rendezvényt pedig az SQLPASS local chapter HUG-MSSQL (Horvát Zoli) szervezte. Így az első előadásom egyben az első SQLPASS előadásom is!
SELECTCOUNT (ItemID) OVER (ORDERBY OrderID) FROM OrderDetails;
You get the following error message:
Msg 11305, Level 15, State 10, Line 1
The Parallel Data Warehouse (PDW) features are not enabled.
Really? Thank you for telling me but what can I do now?
OK, the reason of failure is simple. ORDER BY in OVER clause on an aggregate function works only in version 2012. But this message doesn't help much in debugging.
Mi a történik akkor,
ha egy tábla rekordjait rangsorolnám, és ezt a rangsort rögzíteném is a tábla
egy új
oszlopában? Mondjuk így:
UPDATE Buildings SET nRank = ROW_NUMBER() OVER (ORDERBY nHeight);
Ez történik:
Windowed functions can only appear in
the SELECT or ORDER BY clauses.
Szóval csak SELECT vagy ORDER BY. Szerencsére ez nem olyan
nagy gond. Használhatunk CTE-t, beágyazott query-t vagy view-t, és már
teljesítettük is a fenti megkötést. Hogy pontosan hogyan, az ebből a
script-sorból kiderül. A CTE-s verziót be is kopizom ide (szerintem ez a
legelegánsabb).
WITH Ranking AS
(
SELECT
nRank
,ROW_NUMBER() OVER (ORDERBY nHeight) AS nComputedRank
FROM
Buildings
)
UPDATE
Ranking
SET
nRank = nComputedRank;
Nagy rekordszám esetén érdemes elgondolkodni egy indexelt
temp tábla használatán. A lemezre írásnak ugyan van költsége, de lehet, hogy
ezt az indexek miatt bőven behozzuk az update-nél.
Hegedűs Miklós kollégám - miután az SSIS a kezei közt lehelte ki a lelkét egy pakk futtatása közben -, észrevette, hogy az SQL Server-en, az SSIS után beragadt session a rejtélyes -2-es azonosítót kapta. Ezt sajnos a KILL parancs nem tudja kezelni, hibával elszáll:
Msg 6101, Level 16, State 1, Line 1 Process ID -2 is not a valid process ID. Choose a number between 1 and 2048. Kis nyomozás után Miki a megoldást is megtalálta Utsab Chattopadhyay blogján, a CONSULTDBA-n. A -2 az elárvult MSDTC session-öknek dedikált azonosító. Ha a session-t kézzel kell lezárnunk, használhatjuk a KILL-t, ami egy SPID-et, vagy egy UOW (Unit Of Work) azonosítót vár paraméterként. Mivel az előbbi csak 1 és 2048 közé eshet, keressünk egy UOW id-t. A CONSULTDBA szerint így:
SELECT req_transactionUOW FROM master..syslockinfo WHERE req_spid = -2;
Mivel a syslockinfo egy igen régi darab, és a Microsoft azzal fenyeget, hogy a következő SQL Server verzióban már meg se találjuk, én inkább a sys.dm_tran_locks hívását javaslom:
SELECT request_owner_guid FROM master.sys.dm_tran_locks WHERE request_session_id = -2;
Mindkét select egy guid-ot ad vissza, amivel a KILL már működni fog.