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.