Laatst was ik bezig met een database conversie in Microsoft SQL Server 2005. Ik had een script gemaakt om de data vanuit een bron database over te zetten naar een doel database. Bij een nieuwe database vind ik het mooi als een kolom met autonummering netjes met een 1 begint. Hier is een handig statement voor: dbcc checkindent. Om een tabel opnieuw te nummeren, kun je de onderstaande code uitvoeren.
DELETE tblActie DBCC CHECKIDENT('tblActie', RESEED, 0)
De afgelopen weken kreeg ik van twee verschillende klanten een vrijwel identieke vraag. De ene klant wilde een uitbreiding in een bestaand programma om bij een bepaalde datum de eerstvolgende werkdag te bepalen. De andere wilde in een document een datum afdrukken waarop uiterlijk gereageerd kan worden. Voor deze datum geldt als regel dat men 20 dagen de tijd krijgt om te reageren. Als oplossing voor beide vragen heb ik een SQL functie gebruikt.
Bij DTS zullen de meeste lezers aan het volgende bedrijf denken: DTS Meppel. Dat is natuurlijk prima, niets mis mee. Ik vermoed echter dat er ook lezers zijn die de afkorting DTS kennen vanuit SQL Server. DTS staat dan voor Data Transformation Services. Over die DTS gaat het hier. In de Enterprice Manager van SQL Server 2000 heb je de mogelijkheid om een DTS package te maken. Vanaf SQL Server 2005 is DTS in mijn ogen volwassener geworden. De DTS functionaliteit zit echter wel een beetje verstopt en is verweven met Visual Studio. Deze integratie kom je ook tegen in de naamgeving SSIS (SQL Server Integration Service). Onder deze afkorting kun je op Internet meer voorbeelden vinden.
Een probleem waar jullie natuurlijk zelf nooit tegenaan lopen maar andere ontwikkelaars wel, is dat het soms lastig is om een oude applicatie die je ooit hebt geschreven na een paar maanden / jaren nog te begrijpen. Om nog maar te zwijgen over de ellende die je tegenkomt wanneer je hele lappen code van een collega moet bestuderen. Met DTS heb je de mogelijkheid om op een gestructureerde manier een proces samen te stellen. In plaats van een hele brij code is het meer een kwestie van componenten bij elkaar slepen en hierbij de juiste properties in te stellen.
Ok, tijd voor een voorbeeld:
Voor een uitbreiding van een website bij mijn opdrachtgever kreeg ik laatst het verzoek om een stored procedure te maken waarmee je documenten uit een database kunt vinden. Als zoekcriterium kun je hiervoor oa. een aantal woorden invullen dat binnen de tekst moet voorkomen. Voor deze stored procedure heb ik dynamisch SQL gebruikt. Dynamisch heeft hier de betekenis dat je de query runtime opbouwt en dan pas uitvoert. Deze techniek zul je niet vaak gebruiken, omdat juist de kracht van stored procedures is dat deze vooraf gecompileerd zijn en daardoor snel het gewenste resultaat opleveren. Ook zul je hierbij bewust moeten zijn van het gevaar van SQL injection. Bij deze opdracht heb ik toch voor dynamische SQL gekozen, omdat het aantal zoekwoorden kan variëren van 0 tot meer dan 10.
De totale stored procedure (SP) is te lang om hier in z’n geheel weer te geven. Dit verhaal zou dan ook voor sommigen saai en langdradig worden en dat is nu net wat je niet verwacht bij een artikel met ‘Dynamisch’ in de titel. Om de vaart erin te houden, wil ik in dit blog daarom de belangrijkste onderdelen even kort benoemen. Wie weet helpt het iemand op weg die ook met dynamisch SQL wil werken. Ik ben overigens best benieuwd naar andere voorbeelden van geschikte toepassingen van deze techniek.
Dit geeft dan:
Boer, R. de
Vaart, R. van der
Bergkamp, D.
Schip, J. van ‘t
Op zich een goede manier om namen weer te geven, maar soms wil je liever de namen op een normale manier tonen.
R. de Boer
R. van der Vaart
D. Bergkamp
J. van ‘t Schip
Met onderstaande selectie kun je de naam van een persoon op een normale manier weergeven, zonder overbodige spaties.
SELECT voetballer = LTRIM(RTRIM(ISNULL(voorletters, '') + ' ' + ISNULL(tussenvoegsels, '')) + ' ' + ISNULL(naam,'') ) FROM tblspeler
Een aantal zaken mbt Delphi (Win32 + Prism):
Nog wat leuke informatie mbt .Net algemeen:
prince.WaitForObjectVisible (princess);
prince.WalkTo (princess);
prince.Kiss (princess);
Een update statement in SQL Server. Ik kom ze bijna dagelijks tegen. Meestal is de syntax erg eenvoudig. Soms is de where clause wat uitgebreider, wanneer de update afhankelijk is van de inhoud van een andere tabel. Hieronder een voorbeeld van een update query zoals ik ze tot nu toe meestal maakte.
UPDATE MetaLoginMenu
SET Positie = 20
WHERE MetaMenuID =
(
SELECT MetaMenuID
FROM MetaMenu
WHERE MenuNaam = ‘mnuAbout’
)
AND MetaLoginID = 3
In dit voorbeeld gaat het nog om slechts twee tabellen. In de praktijk kunnen dit er al snel meer zijn, waardoor de where clause wat onoverzichtelijk wordt. Een constructie met een inner join kan dan uitkomst bieden.
UPDATE L
SET Positie = 20
FROM MetaLoginMenu L INNER JOIN
Metamenu M ON L.MetaMenuID = M.MetaMenuID
AND MenuNaam = ‘mnuAbout’
AND MetaLoginID = 3
De onderste variant lijkt op het eerste gezicht wat vreemd: er staat geen where in de query! Toch is het resultaat van beide queries identiek. Qua performance is er amper verschil merkbaar. Bij een meer uitgebreide update kies ik de laatste tijd steeds vaker voor de onderste variant.
Bij mijn huidige opdrachtgever zijn veel relatief kleine applicaties gemaakt met Visual Basic 6. Het beleid is erop gericht dit terug te brengen tot een aantal grote applicaties. Toch komt het nog wel eens voor dat de mensen op de werkvloer een oude applicatie missen en bepaalde gegevens willen raadplegen. Vorige week kreeg ik de opdracht om in korte tijd de applicatie DEKKINGSBOEKEN weer terug te zetten. In het verleden maakte deze applicatie gebruik van een Oracle database. De server waar dit op draaide is inmiddels historie. Van de data had men nog wel een back-up naar SQL Server gemaakt. Kwestie van connectiestring aanpassen dachten we in eerste instantie. De klus bleek toch iets omvangrijker dan dat: de VB code bevatte een groot aantal SQL statements met een specifiek Oracle dialect. Dit laten staan was geen optie: daar zou het programma op stuk lopen.
Lees verder…
De laatste tijd gebruik ik regelmatig het tooltje SQL Digger om te zoeken naar tekst in Views, Stored Procedures, etc. in een SQL Server database. Zo kun je bijvoorbeeld snel kijken of er een view/procedure bestaat die je kunt gebruiken voor het ophalen van bepaalde gegevens.
Je kunt SQL Digger ook integreren in de .NET IDE en SQL Server Manager.
Website: SQL Digger
Oa voor unit testen wilde ik nested transacties gebruiken bij MS Sql Server 2005. Tot mijn verbazing is dit standaard niet mogelijk via ADO! Het is wel mogelijk via SQL, maar dan nogal omslachtig… Uiteindelijk is het me gelukt…
Je kunt namelijk handmatig transacties starten en committen via SQL met “BEGIN TRANSACTION” en “COMMIT TRANSACTION” statements. Dit kan ook nested, waarbij je transacties een naam kunt geven, bijv: “BEGIN TRANSACTION level1″.