Jeg har efterhånden arbejdet med Microsoft SQL Server i mange år.  Da jeg første gang stiftede bekendtskab med SQL Server, hed det Microsoft SQL Server 6.5.  Siden er der kommet mindst versionerne 7, 2000, 2005, 2008 (R2), Azure og 2012 til.

Til trods for det, vil jeg på ingen måde kalde mig ekspert i hverken sproget T-SQL eller i administration af SQL Server.  Det er mere et nødvendigt onde end en lidenskab.  Jeg foretrækker dog langt mere at skrive rå SQL end en ORM, men det kan måske være et emne til et andet indlæg.

Dermed sker det heller ikke sjældent, at jeg opdager nye ting i T-SQL.  Som f.eks. forleden, da jeg faldt over keywords SOME, ANY og ALL.  Tilsyneladende blev de tre operators introduceret med SQL Server 2005, så de kan næppe kaldes nye.  Men de er altså gået min næse forbi til trods for dens størrelse.

Det sjove ved SOME og ANY er, at de fungerer på samme måde.  SOME lader til at være Microsoft’s opfindelse, mens ANY er standarden.  På dansk svarer “some” til ordet “nogle”, mens “ANY” svarer til “nogen”.  Ordet “any” (og “nogen”) bruges i negeringer og i spørgsmål, så måske har Microsoft tænkt, at man skal bruge ANY i kombination med NOT (altså en negering):

SELECT ...
FROM Tabel
WHERE Kolonne > SOME(SELECT ...)

SELECT ...
FROM Tabel
WHERE NOT Kolonne > ANY(SELECT ...)

Jeg tror, de fleste har prøvet det: Man sidder og roder i SQL Server Management Studio med 200 forskellige queries på forskellige databaser, og pludselig er man kommet til at køre en DROP eller DELETE statement i den forkerte database.

Der findes en option i SSMS, der kan hjælpe til med at mindske risikoen for at lave den type bommerter: Man kan farvekode sine queries alt efter, hvilken server man er forbundet til.  F.eks. kan man give alle queries, der er forbundet til ens produktionsserver, en rød farve, mens queries mod testserveren er grønne (den farvekombination virker selvfølgelig kun, hvis man ikke er rød/grøn farveblind).  Det ser ud som vist herunder.

image

Farven sættes i “Connect to Database Engine” skærmbilledet.  Tryk “Options >>” og vælg fanen “Connection Properties”.  Sæt et hak i “Use Custom Color” og vælg den ønskede farve.  SSMS husker den valgte farve pr. server.  Nogle gange er det nødvendigt at genstarte SSMS for at ændringen får effekt på nye queries.

image

Betragt følgende stump SQL og overvej resultatet:

SET ANSI_NULLS ON;
SELECT 
CASE 
    WHEN NOT 'EnStreng' IN ('A', NULL) THEN 'Ja'
    ELSE 'Nej'
END

Hvis du gættede på, at resultatet ville blive ‘Nej’, er du klogere end mig (hvilket mange er).  Sagen er, at med ANSI_NULL ON, vil alle sammenligninger med NULL returnere værdien UNKNOWN, og alle boolean operatorer vil returnere UNKNOWN, når de bruges sammen med UNKNOWN.  Derfor vil første case aldrig evaluere til TRUE.

Som hovedregel må man aldrig bruge =, < og > ved sammenligninger med NULL, når ANSI_NULL er ON.

For fremtidige versioner af SQL Server (hvad så end det betyder) vil ANSI_NULLS altid være ON.  Mere info her: http://msdn.microsoft.com/en-us/library/ms188048(v=sql.110).aspx

 

Forleden blev jeg mindet om SQLCMD Mode i SQL Server Management Studio.  Jeg brugte det flittigt i en periode for nogle år tilbage, men er af en eller anden grund kommet væk fra det.  SQLCMD Mode gør det muligt at kalde sqlcmd.exe direkte i sine SQL scripts i SSMS, og det kan være ganske nyttigt. 

Opsætning

For at slå SQLCMD Mode til, skal man trykke på knappen SQLCMD Mode i værktøjslinjen i SSMS.  Som standard er denne knap ikke synlig.  For at tilføje den skal man gå ind under Tools –> Customize menuen.  Under fanen Commands skal man trykke Add Command og finde knappen under Query kategorien.  Man kan også bruge menuen Query –> SQLCMD Mode.

image

Når SQLCMD Mode er slået til, kan man fra SSMS eksekvere SQLCMD kommander ved at skrive et kolon (‘:’) foran kommandoen.  SQLCMD kommandoer fremhæves som grå linjer i SSMS. 

Ændre forbindelse til SQL Server

En af de gode kommandoer er :Connect.  Med :Connect kan man forbinde til en SQL Server direkte fra sit SQL script:

image

Det betyder, at man kan gemme forbindelsesinformation direkte i sine SQL filer.

Variable

En anden nyttig funktion er muligheden for at definere variable. I nedenstående eksempel benytter jeg det til hurtigt at generere noget testdata.  Jeg har defineret en tabel kaldet Table_1, der har default værdier på alle kolonner.  Vha. SQLCMD’s mulighed for at definere variable og SSMS’ definition af GO, kan jeg eksekvere min INSERT statement 10 gange:

image

Eksekvering af cmd prompt kommandoer

SQLCMD kan selvfølgelig også andre sjove ting.  F.eks. kan man eksekvere almindelige cmd prompt kommandoer vha. ‘!!’, hvis man skulle få lyst til det:

image

Standardopsætning

Hvis man som standard ønsker at åbne alle SQL scripts i SQLCMD Mode i SSMS, skal man gå ind under Tools –> Options og tilvælge det:

image

Når man sidder med T-SQL, er det ofte nyttigt at se nogle enkelte rækker for de tabeller, man arbejder med.  Bare for at se hvad man har med at gøre.  I SQL Server Management Studio er det muligt at lave en genvejstast til at vælge de første X rækker fra en tabel.

  1. I Management Studio vælg menuen Tools –> Options. 
  2. Gå til Keyboard –> Query Shortcuts. 
  3. Vælg en tastaturgenvej (f.eks. Ctrl+3) og skriv “SELECT TOP 10 * FROM” (skriv ikke et tabelnavn).
  4. Tryk “Ok”.

image

Start nu en ny query og opret en forbindelse til en database.  Skriv et tabelnavn (og ikke andet), markér det og tryk Ctrl+3 (hvis altså det var Ctrl+3, du valgte ovenfor).  Voila!

image

 

Det spændende ved programmering er, at man hele tiden lærer noget nyt.  Jeg vil forsøge næsten dagligt at skrive på dotninjas.dk, hvad jeg har lært af små ting fornylig.

Med SQL Server 2008 forbedrede Microsoft muligheden for at gemme filer i databasen ved at introducere FILESTREAM.  Med FILESTREAM bliver filer gemt som fysiske filer på disk, mens al tilgang til filerne gik gennem T-SQL.  Dette blev gjort for at forbedre performance betragteligt ift. tidligere versioner af SQL Server, hvor BLOBs blev anvendt til at gemme filer.

Med SQL Server 2012 udbygger Microsoft FILESTREAM yderligere ved at tillade, at man tilgår de fysiske filer direkte gennem Windows I/O API’en.  Den nye funktionalitet kaldes FileTables, og det ser ret interessant ud.  FileTables tillader, at man kan tilgå filerne uden at skulle gå den tunge vej gennem transaktioner, samtidig med at filerne administreres af SQL Server, og dermed indgår i den daglige vedligehold med backups etc.  Fordi FileTables bygger på almindelige filer, tillader det også bruge af standard Windows directories.  FileTables bygger ovenpå FILESTREAM, hvillket betyder, at f.eks. FULLTEXT search virker i filerne.

Det er en længere historie at sætte FILESTREAM og derefter FileTables op i SQL Server 2012.  Når det er gjort, har SQL Server oprettet et fil share på serveren, som man skal bruge til at tilgå filerne, hvis man ønsker at bruge Windows I/O API’en.  Funktionen FileTableRootPath bruges til at få stien til dette share:

   1:  SELECT FileTableRootPath();

For at benytte FileTables kræves en speciel tabel databases.  Denne tabel indeholder en række for hver fil, der gemmes i det oprettede fil share.  Det betyder, at SQL Server intercepter alle I/O til dette fil share.  Filsystemet i Windows understøtter som sådan ikke ACID transaktioner, men så vidt jeg kan forstå, benytter SQL Server diverse locks på tabellen til at styre concurrency

Med et share og en FileTable på plads, kan man nu meget nemt skrive filer til databasen uden brug af SQL (men husk – det er uden en transaktion):

   1:  string rootShare = @"\\machine\blabla";
   2:  for (int i = 0; i < 10; i++)
   3:  {
   4:      File.WriteAllLines(rootShare + String.Format("\\TextFile_{0}.txt", i), new string[] { "Hello " + i });
   5:  }

Følgende SQL afslører, at der rent faktisk er dukket 10 rækker op i vores FileTable:

   1:  SELECT file_stream.GetFileNamespacePath()
   2:  FROM MyFileTable

FileTables er tilgængeligt i den SQL Server 2012, der er til download d.d. (RCO hedder den vist) – og det er også tilgængeligt i Express edition. Sweet.

Allerførst et ønske om en glædelig jul og et godt nytår :-)

 Dernæst et lille tip om at du kan erhverve dig en licens til Linqpad for kun 100kr ($19) frem til 31. december - den kan installeres på op til 3 maskiner samtidigt og er en varig licens til fremtidige versioner.

Hvis du ikke allerede kender Linqpad så er det et glimrende tidspunkt at teste det. Personligt bruger jeg den til mange af de situationer, hvor man liiige laver et lille testprojekt for at teste en stump kode - og ikke mindst til linq queries, entity framework forespørgsler, regex patterns etc.

Jeg husker den glade sommer (husker dog ikke helt hvornår det var) hvor jeg lå i solen og prøvede at læse op til en SQL Server eksamen. Det lykkedes aldrig at komme forbi kapitlet om opbygningen af den fysiske filstruktur i databasen. Det hører jo med til en MS certificering, så den blev ikke til noget.

SQL Server er den database jeg har arbejdet mest med, men til mit seneste hobby webprojekt var det naturlige valg MySql. Pandasan var så flink at vise mig XAMPP som findes i en light udgave, hvilket var præcis det jeg skulle bruge til mit hygge project. Uden at skulle installere services kan man ha' MySql kørerende på sin lokale maskine på få minutter.

For et hobby website har MySql syntax en meget nyttig kommando LIMIT. Denne kommando alene har tidligere gjort at jeg har prøvet kræfter med MySql. Paging bliver et spørgsmål om man lige kan gange sidestørrelse med sidenummer og det bør være overkommelig matematik for en programør. MySql provideren til .Net findes på MySql's website og er dermed ikke en 3rd party komponent som det var for nogle år siden.

Det virker generelt som om der er sket en del med MySql siden jeg sidst så på det. Og man kan også spørge om Are Commercial Databases Worth It?. Star Wars sammenligninger giver altid letforståelige forklaringer. Jeg har ikke selv oplevet de store forbedringer i SQL Server for mine små projekter. Og t4rzsan har jo set lidt på Parametriserede queries vs. stored procedures, så den konto er også brugt selvom MySql har fået Stored Procedures for snart lang tid siden.

Betyder det så noget at Oracle har købt SUN og dermed også MySql? Jeg har i forbindelse med et kursus på ITU stødt på Oracle og det var ikke overbevist. Det virker unødigt komplekst for at sælge nogle konsulenttimer, hvilket jeg mener er at narre folk. Selvom der er andre firmaer som bygger deres forretning på denne model, er det jo ikke et argument for at gøre det selv.

Nok med brok, se at komme igang med MySql. XAMPP kan downloades som zip og køres næsten uden setup. Det er et værdigt alternativ til SQL Server (også Express).