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.
Két napja kérdezték tőlem, hogy egy bit típusú oszlop mennyivel növeli meg egy sor méretét? Kis gondolkodás után azt válaszoltam, hogy egy byte-tal. És kettő? Két byte-tal - válaszoltam gyanútlanul, és már bele is sétáltam a csapdába.
Az SQL Server ugyanis trükkösen tárolja a bit típusú adatokat. Nyolc bit egy byte, ennek megfelelően nyolc bit típusú oszlop fér el egyetlen byte-on. Ha az oszlopok száma 1 és 8 között van, akkor 1 byte-ot foglalnak, ha 9 és 16 között, akkor 2 byte-ot, és így tovább.
Két napja bukkantam egy érdekes cikkre az MSSQLTips-en, Aaron Bertrand-tól, amiben az ISNULL és a COALESCE viselkedését hasonlítja össze. Talán nem egy millió forintos kérdés, de hibakeresésnél, vagy milliszekundumokra kihegyezett lekérdezéseknél jól jöhet, érdemes elolvasni.
Akinek nincs ennyi ideje, vagy csak lusta :), azoknak hajtás utánra kanyarítottam egy összefoglalót.
Ma hajnalban a cég egyik adatkockája a betöltésnél elhasalt. A hibaüzenet pontosan megadta, melyik package, melyik lookup transzformációja a hibás. BIDS-ben futtatva szépen reprodukálható volt a hiba, bizonyos értékeket nem talált meg a referencia táblában. Nosza, a "no match" kimeneten elkaptam néhány rekordot, a hiányzó értékeket pedig SQL-ből ellenőriztem a referencia táblában... És ott voltak. Nahát. Ráadásul úgy nézett ki a dolog, mintha ugyanahhoz a kulcshoz hol találna párt, hol nem.
Nos, egy jó adag kínlódás - és sok guglizás - után lehullt a lepel: a T-SQL nem törődik a karakteres mezők végén található szóközökkel, az SSIS lookup viszont igen (legalábbis Full Cache esetén). Az igazán gonosz dolog az, hogy gondoltam is erre, és a LEN() függvénnyel ellenőriztem is az értékeket, csakhogy a LEN() szintén nem számolja ezeket a szóközeket.
SELECT LEN('WHITESPACE'), LEN('WHITESPACE ')
Az eredmény 10 és 10, a LEN() az utolsó szóközt nem látja. Viszont a DATALENGTH() már igen:
Ilyen esetekben megoldás lehet, ha SSIS-ben a TRIM() függvényt, SQL oldalon pedig az RTRIM()-et használjuk, vagy ha a lookup transzformációnál nem a Full Cache-t állítjuk be.
Jegyezzük meg: az SSIS lookup nem csak a kis- és nagybetűkre érzékeny, de a sorvégi szóközökre is!
Első
posztomban írtam arról, hogyan kérdezhetjük le az SSIS csomagok listáját PowerShell-el SQL Server 2008 alatt. Az új, 2012-es kiadásban azonban egy
teljesen új módszert és környezetet kapunk csomagjaink telepítéséhez és kezeléséhez.
(Ezzel párhuzamosan – a korábbi SQL
Server-ekkel való kompatibilitás miatt – a korábbi struktúra is megmarad
egyelőre.)
Ha a csomagok listájára van szükségünk, az SQL
Server 2012 (RC0)-ban az SSISDB-ben (T-SQL) vagy a Microsoft.SqlServer.Management.IntegrationServicesnévtérben (.Net, PowerShell) kell kutakodnunk. A
T-SQL megoldás nagyjából így néz ki:
use SSISDB
go
select
pack.nameas [PackageName]
,pack.[description] as [Description]
,fold.nameas [Folder Name]
,proj.nameas [Project Name]
,fold.created_by_name as [OwnerName]
,proj.created_time as [Project Created Time]
,proj.last_deployed_time as [Project Last Deployed Time]
,cast (pack.version_major asvarchar(10))
+ '.' + cast (pack.version_minor asvarchar(10))
+ '.' + cast (pack.version_build asvarchar(10))
as [Version]
,pack.version_comments
,proj.object_version_lsn as [Project Version]
from
catalog.packages pack
innerjoin catalog.projects proj on pack.project_id = proj.project_id
innerjoin catalog.folders fold on proj.folder_id = fold.folder_id;
Érdemes azonban
alaposabban végigbogarászni az SSISDB-t, mert olyan információkra bukkanhatunk,
amikről korábban nem is álmodtunk (pl. catalog.executions).
PowerShell-el
közelítve a dologhoz, hasonló listát kaphatunk, ha végigzongorázzuk a Catalogs.Folders.Projects.Packages
matrjoskát:
Persze, az új
struktúra előnyei nem a csomagok listázásánál csúcsosodnak ki. Az SSIS 2012
(RC0) egyik remek újdonsága például, hogy a már telepített project verziók között szabadon válthatunk (feltéve, hogy az SSISDB katalógusPeriodically Remove Old Versions tulajdonsága False, mert ellenkező esetben a Maximum Number of Versions per Project-nél régebbi verzióinkat az SQL Server szanálja).
Erre – természetesen –
nem csak a GUI-n keresztül van lehetőségünk. Az SSISDB tárolt eljárásai közt
ott lapul a catalog.restore_project,
(Az $ssis változóból sejthető, de azért
tisztázzuk: ez akkor működik, ha az adott session-ben már betöltöttük az
assembly-t és csatlakoztunk a szerverhez (ő lenne az $ssis)).