Glorf.it

Glorf IT

Bedenkliches aus dem IT-Alltag

24. Juni 2007 um 15:04

Gibs ihm, Joe!

Ich bekomme dienstlich recht viele Anfragen per Mail, wie man mit SQL dies oder jenes am besten macht. Die BEschreibung ist meistens zweitdeutig, selten wird die Tabellenstruktur mitgeschickt und nach Daten muss ich förmlich betteln. dabei ist es mit den SQL-Server-Werkzeugen so einfach die CREATE-TABLE-Statements zu bekommen, dass es schon fast lächerlich ist.

Als ich die Antwort vom großen "Joe Celko" auf eine der typischen Anfragen um Hilfe las, stellte ich mir vor, wie ganz viele um ihn herum stehen und rufen: Gibs ihm, Joe!

Why do you spit on us and want us to do your homework/job for you?

Please post DDL, so that people do not have to guess what the keys, constraints, Declarative Referential Integrity, data types, etc. in your schema are. Sample data is also a good idea, along with clear specifications. It is very hard to debug code when you do not let us see it.

Hier steht der die komplette Anfrage: Joe Celko The SQL Apprentice: Updating based on values of two records

Leider fanden einige andere Diskussionsteilnehmer die Bemerkung von Joe nicht gut. Wahrscheinlich werden ihnen nicht so oft so Wischi-Waschi-Fragen gestellt…

24. Juni 2007 um 14:56

SQL-Server-2005: OVER() mit Aggregatfunktionen

Im Artikel "SQL Sever 2005: Using OVER() with Aggregate Functions" wird auf SQLTeam.com ein nettes Feature beschrieben, das mir bisher entging:

Man kann (ohne Angabe von Group-By) eine Aggregatfunktion nur auf gruppen berechnen lassen. "Früher" war dazu eine Subquery notwendig oder etwas performanter ein Join mit einer Derived-Table. Jetzt kann das sehr elegant in einem Schupps erledigen.

So steht es in einem Bespiel meiner TSQL-Schulung (Datenbank "Northwind", die mag ich immer noch recht gerne):

select P.ProductName,
P.UnitPrice,
P.CategoryID,
(select avg(Pc.UnitPrice)
from "Products" as Pc
where Pc.CategoryID=P.CategoryID)
as "durchschn. Preis der Produktklasse"
from "Products" as P

So könnte es zukünftig aussehen:

select P.ProductName,
P.UnitPrice,
P.CategoryID,
avg(P.UnitPrice) over (Partition by P.CategoryID)
as "durchschn. Preis der Produktklasse"
from "Products" as P

Allerdings bin ich mit dem Zugriffsplan der zweiten Variante noch nicht wirklich zufrieden. Durch die Subquery hat man einen Nested-Loop-Join, durch das Partition-By einen Sort. Was "besser" ist, kann man so pauschal nicht sagen, möglicherweise wäre ein Clustered-Index auf die Spalten in dem Partion-By ideal.

gefunden im SQL Server FAQ Blog

24. Juni 2007 um 14:36

PUSH und POP

Am Donnerstag meldete mit mein dienstlicher Virenscanner, ich habe gar schreckliche "Trojaner" auf dem Rechner. Nach einigen Umständen schaute ich die beiden CMD-Dateien mal an. Sie waren von einer PASS-Konferenz und richteten die Samples für eine der Vorträge ein bzw. entfernten sie wieder. Die Dateien sind ziemlich klein und übersichtlich. Die einzigen Befehle, die ich noch nicht kannte waren
waren PUSHD und POPD. Die enthielten bestimmt kein trojanisches Pferd – ich bin mal gespannt wie lange es dauert, bis unsere obersten Virenschützer zu dem gleichen Ergebnis kommen… ;-)

Mit dem Befehl "pushd" wechselt der Verzeichnis-Kontext wie angegeben. Das bisherige Verzeichnis wird aber gespeichert.

d:\test>pushd c:\temp

Jetzt kann man in dem neuen Verzeichnis arbeiten und am Ende des Batches wieder in das bisherige Verzeichnis wechseln. Das finde ich richtig schick:

C:\temp>popd

Hier werden ein paar weitere Details beschrieben: "PUSHD Windows 98 Windows 98, Windows XP, Windows 2003 .exe, .com .vbs Commands: Change the current directory/folder and store the previous folder/path"

Da man bei uns sofort aus dem System gekickt wird, wenn eine Prüfung einen Virus findet und beim nächsten Anmelden gleich eine Virenprüfung startet, kostete es mich einige Neuanmeldungen bis ich die "bösen" Batches in ein passwortgeschützes ZIP gesteckt hatte und in Ruhe arbeiten konnte. Bei ersten Anlauf hatte ich den Virenscan nur "angehalten", aber unser System scheint nach einiger Zeit auf einen Timeout zu laufen und einen dann rauszuwerfen… Da hatte ich die Dateien noch, weil ich auf eine schnelle Reaktion der Virenschützer hoffte. Später fand er sie noch mal im Recycler. Beim dritten Mal im Temp, weil ich Blödel das Zip noch mal anschaute, und der Zipper das aus irgendwelchen Gründen nicht gleich wegräumte. Erst nach dem vierten Scan, war dann Ruhe… :-)

|