Skip to content
Bild

prinzip Minimalaufwand

Da hatte jemand keine Lust….

Böse Überraschung: SELECT X [AS] Y

Heute beim Arbeiten habe ich ein SQL-Statement angepasst und für einen Cursor verwendet.

SELECT PKTabelle 
       SpalteA, 
       SpalteB
FROM   Tabelle

Lieferte mir…. SpalteA und SpalteB zurück. Dem einem oder anderen wird auffallen, dass das Komma hinter dem ersten Spaltenname fehlt. Der SQLServer interprtiert diesen Syntax so, dass die 1. Spalte zurückgegeben wird mit dem Namen SpalteA, alsowird implizit ein AS verwendet.
Wenn man beim Editieren ein Komma vergisst wundert man sich im besten Fall, warum der SQLServer sich über eine ungleiche Anzahl spalten beschwert. Im schlechtesten Fall mit ein bischen Pech hat man mit falschen Daten weitergearbeitet ohne es wirklich zu merken.

Das Feature mit dem impliziten AS ist nett gemeint….

… aber nett gemeint ist der kleine Bruder von scheiße.

 

 

Schreiben von „static readonly“ Variablen

Wenn man eine CLR für den SQL Server entwickelt benötigt man manchmal eine statische Variable. Die Statische Variablen haben aber den Nachteil, dass sie als readonly erstellt werden müssen, d.h. man kann ihren Wert nur einmal festlegen. Das kann man aber umgehen, indem man die Variablen einfach als Array erstellt. Das Array selber ist nicht mehr veränderbar, seine Größe ist immer Fest. Aber der Inhalt im Array kann immer verändert werden.

Anstatt

public static readonly string MeineVariable = "Text123";

schreibt man einfach

public static readonly string[] MeineVariable = new string[1];

Im Code muss man anstatt MeineVariable dann MeineVariable[0] verwenden.

Was aber wichtig ist:

Die static readonly Felder werden im SQL Server für jede Assembly nur einmal im Speicher gehalten, egal wieviele Proceduraufrufe in der Assembly erfolgen. Wenn ein Aufruf der CLR-Prozedur so lange dauert, dass in der zwischenzeit eine Prozedur in der gleichen Assembly aufgerufen wird welche die gleiche static readonlyVariable verändert, betrifft die Änderung der Variable evtl. jede laufende Prozedur! D.h. man muss daran Denken, dass der Inhalt einer Variable von einem 2. Prozeduraufruf in der Assembly jederzeit verändert werden kann.