Glorf.it

Glorf IT

Bedenkliches aus dem IT-Alltag

29. Januar 2010 um 18:32

Nur Stimmen

Da ich nahezu unmusikalisch bin, hat mich die folgende Darbietung schon beeindruckt. Irgendwann mittendrin war ich davon überzeugt echte Instrumente zu hören.

Link: The Voca People - live

Schon klasse…

28. Januar 2010 um 20:26

iPad? Wirklich iPad?

Bei dem Begriff "iPad" fällt mir spontan der uralte MadTV-Sketch ein, der eigentlich den iPod auf die Schüppe nimmt. "Pad" bzw. "Pod" klingt für Amerikanischer wegen MaxiPad offenbar sehr nach Damenbinde: Wie gesagt, damals ging es um "iPod" und "Pad" bzw. "Maxi Pad".

http://www.youtube.com/watch?v=lsjU0K8QPhs

Den Film fanden die Apple-Mitarbeiter vermutlich so komisch, dass sie jetzt einen echten "iPad" auf den Markt bringen. Immerhin hat er jetzt schon den Spitznamen "iTampon". Wann kommt dann der iRack?

OK, das ist schon ziemlich unter der Gürtellinie, aber bei der Steilvorlage geht es einfach nicht anders… Außerdem bin ich mal gespannt wie Apple mit den vorhersehbaren Namenskonflikten umgeht. Das Web hat jedenfalls ein neues Thema… Hier ein Bild dazu… 😉

Share photos on twitter with Twitpic

26. Januar 2010 um 20:09

Bug: Syntax-Fehler im Kommentar

Mein Kollege Diethard machte mich auf einen Fehler im Microsoft SQL Server 2005/2008 aufmerksam, der bei Microsoft schon bekannt ist: Wenn man (*) als erstes nach in einem Zeilenkommentar schreibt, dann kommt ein Syntaxfehler.

Hier ein Beispiel:

--(*)

Weil das so kurz ist, hier ein hübsches Repro von Diethard:

RAISERROR('--(*)',0,0);
GO
--(*)
GO
RAISERROR('-- (*)',0,0);
GO
-- (*)
GO
/* Results
--(*)
Msg 102, Level 15, State 1, Line 1
Falsche Syntax in der Nähe von '--(*'.
-- (*)
*/
GO
RAISERROR('COUNT(1) --(*)',0,0);
GO
SELECT COUNT(1) --(*)
	FROM sys.sysobjects
GO
RAISERROR('COUNT(1) -- (*)',0,0);
GO
SELECT COUNT(1) -- (*)
	FROM sys.sysobjects
GO
/* Results
COUNT(1) --(*)
Msg 102, Level 15, State 1, Line 1
Falsche Syntax in der Nähe von '--(*'.
COUNT(1) -- (*)

-----------
1946
*/

Weil Microsoft dem so wenig Bedeutung beimisst, wird es vermutlich erst am St.Nimmerleinstag beseitigt, bemerkte ich ihm gegenüber. Daraufhin erstellte Diethard einen Algorithmus, ob der Tag schon gekommen ist:

DECLARE @AfterStNimmerlein bit;
BEGIN TRY
  EXEC('--(*)'); SET @AfterStNimmerlein = 1; 
END TRY BEGIN CATCH
  IF ERROR_NUMBER() = 102 SET @AfterStNimmerlein = 0; 
END CATCH; 
SELECT AfterStNimmerlein=@AfterStNimmerlein;

😉

Aber was uns wirklich interessieren würde: Wie kann es zu einem Syntaxfehler in einem Kommentar kommen?

26. Januar 2010 um 18:45

Angebote für Paare in Erlangen

Bei uns in Erlangen startet bald wieder eine "MarriageWeek". Dahinter verbirgt sich eine Woche in der viele Veranstaltungen für Paare unter dem Motto "Gutes für Ehepaare" angeboten werden. Der Auftakt ist im Gemeindehaus am Bohlenplatz in dem eine bekannte Gemeinde ihren Sitz hat. 😉

Einige Veranstaltungen kosten Eintritt, andere nicht. Weiter unten auf der Seite gibt es auch einige Rabattaktionen. Mein Highlight ist der OBI:

Ehepaare erhalten gegen Vorlage der Heiratsurkunde bei 0 bis 10 Ehejahren 10 %, bei 11 bis 24 Ehejahren 15% und über 25 Ehejahren 20 % Rabatt auf einen Einkauf.

Darüber hinaus gewinnt das am längsten verheiratete Ehepaar einen Einkaufsgutschein von 200,00 €

Das wären 15% für uns…

25. Januar 2010 um 20:13

Webcasts zu Performance-Monitoring und -Tuning

Klaus – unser Regionalgruppenleiter der örtlichen SQL-PASS – wies mich auf ein paar kostenlose Webcasts zu Performance-Monitoring und -Tuning mit Microsoft SQL Server bei sqlworkshops.com hin. Sie sind als Webcasts vom Level 400 ausgeschrieben.

Wenn man sich die Seite ansieht, dann wird klar, dass die Anbieter mit dieser Maßnahme auf sich aufmerksam machen wollen. Das finde ich gut: man kann sich eine Meinung über deren Angebote bilden und muss so nicht die Katze im Sack kaufen. Ich persönlich habe immer Hemmungen Schulungen zu solchen Themen zu besuchen, weil ich schon zu oft enttäuscht wurde. Das würde mir hier nicht passieren. Jetzt müsste ich mir nur die Zeit nehmen die ersten beiden Teile anzusehen (der dritte erscheint erst noch als zeitlich befristetes Angebot).

Ich habe es so verstanden, dass es sich um den darunter erwähnten Workshop von R. Meyyappan handelt, den sowohl Lubor Kollar als Itzik Ben-Gan auch loben.

Da ich es aber noch nicht geschaut habe, ist die Info nur ohne Gewähr. Aber weil sich jeder selber eine Meinung bilden kann, sollte das kein Problem sein. Außerdem habe ich jetzt schon die Empfehlung von drei SQL-Größen, was soll da noch schief gehen?

25. Januar 2010 um 17:53

GMX geht nicht

… und sagt nix darüber. Schade.

Komischerweise konnte ich zeitweilig mal die Mail abrufen. Beim Mailversand scheitert es aber. Während auf der GMX-Seite keine Störungen bekannt sind, haben sie gegenüber Heise.de sie Störungen zugegeben:

Auf Nachfrage von heise online konnte GMX-Sprecher Holger Neumann noch keine Auskünfte zu Ursache und Ausmaß der Störung geben. Man Arbeite "mit Hochdruck an der Lösung des Problems", erklärte er.

Schade, dass auf deren Störungsseite davon nichts zu lesen ist:

Daher müssen sich die Benutzer selber organisieren, wie hier zum Bleistift.

Update: Kurz nachdem ich das Posting fertig hatte, konnte ich auch wieder Mails verschicken.

24. Januar 2010 um 16:08

Grundlagen zum Optimizer und Statistiken

Der Artikel "13 Things You Should Know About Statistics and the Query Optimizer bei Simple-Talk ist ein sehr guter Einstieg in die Grundlagen zum Optimizer und Statistiken am Microsoft SQL Server. Alle grundlegenden Begriffe werden erklärt und damit auch welche Indexe der Optimizer gerne aufgrund welcher Statistiken auswählt.

Ergänzend dazu eignet sich die Artikel "Column Statistics Give the Optimizer an Edge"
und "Making the Most of Automatic Statistics Updating" beim "SQL Server Magazine". Hier erklärt Kalen Delaney die Feinheiten bzgl. der leider nicht immer aktuellen Statistiken.

Wer das ganz lieber bei Microsoft nachlesen will, der wird in den Books Online fündig.

13. Januar 2010 um 19:58

NoSQL-Datenbanken

Über den sehr interessanten Artikel "Aufstand der NoSQL-DBs" in der Zeitschrift "database pro 1/2010" wurde ich auf die sogenannten "no-SQL-Datenbanken" aufmerksam. Den Begriff kannte ich bisher noch nicht. Das ist ein Oberbegriff für alle möglichen "neuen" Datenbanksysteme, die Bedürfnisse erfüllen, die man mit den bisherigen relationalen Systemen nicht oder nicht gut abdecken kann. Die relationalen Systeme sind sehr klar definiert und man kann relativ schnell das Grundkonzept erfassen und erläutern.

Die NoSQL-Systeme definieren sich hingegen dadurch, dass die anders funktionieren als relationale Systeme. Dementsprechend groß ist die Vielfalt der dahinter steckenden Technologien. Einen ganz guten Überblick bietet die Seite www.nosql-databases.org. Hier werden die Datenbanksysteme so kategorisiert:

  • Wide Column Stores
  • Document Stores
  • Key Value / Tuple Stores
  • Eventually Consistent Key Value Stores
  • Graph Databases
  • Object Databases
  • und sonstigen 😉

So unterschiedlich wie die eingesetzten Technologien, so unterschiedlich sind die Anforderungen, die die Systeme erfüllen wollen. Daher wird "NoSQL" mittlerweile auch mit "not only SQL" übersetzt. Im oben genannten Artikel wird NoSQL so definiert:

Neue Datenbanken und Datenbanktechnologien, die in der Mehrzahl viele der folgenden Punkte adressieren: nicht relational, verteilt, Open Source und horizontal skalierbar. Des Weiteren gelten häufig noch folgende Eigenschaften: relativ schemafrei, Replikationsunterstützung, Partitionierung- beziehungsweise Sharding-Unterstützung, einfaches API, "evantually consistent" […] und einiges mehr.

Das klingt nun nicht wirklich nach einer Definition, was aber daran liegt, dass die verschiedenen Systeme sich sehr stark voneinander unterscheiden. Ich bin mal gespannt, ob einzelne dieser Systeme sich im Markt etablieren können.

10. Januar 2010 um 14:19

SQL-PASS Franken: Unternehmensplanung mit dem SQL Server

SQL-PASSNächste Woche am Dienstag, den 19.01.2010 um 18:30 Uhr, findet in Nürnberg wieder der nächste Vortrag der SQL-PASS Franken statt. Das Thema stammt aus der Praxis und stellt ein konkretes Einsatzszenario dar, anstelle der bisher üblichen Ausschnitte einzelner Themen: "Unternehmensplanung mit dem SQL Server am Beispiel des Bekleidungshauses Rudolf Wöhrl AG". Hier die offizielle Beschreibung:

Unternehmensplanung mit dem SQL Server am Beispiel des Bekleidungshauses Rudolf Wöhrl AG

Für die erfolgreiche Steuerung von Unternehmen sind Unternehmensplanungen notwendig. Neben der standardisierten Finanzplanung (GuV, Bilanz) gibt es in jedem Unternehmen eine große Anzahl individueller, dynamischer Planungsaufgaben: Finanzplanung, Absatzplanung, Produktionsplanung, Personalplanung, Investitionsplanung, Budgetierung und Forecasting.
Unternehmensplanungen sind komplexe, sich wiederholende Prozesse, die sich in jedem Unternehmen anders gestalten. Sie sind direkt abhängig von Unternehmensabläufen und -strukturen. Häufig von mehreren Personen erstellt, durch Genehmigungsverfahren angenommen, abgelehnt, überarbeitet und schließlich in einem großen Gesamtplan zusammengeführt.

Das Bekleidungshaus Rudolf Wöhrl AG hat auf Basis des SQL Server 2008 unter anderem eine Absatz- und Ergebnisplanung für ihre 40 Standorte erfolgreich realisiert.
Herr Marcus Kresin, BI-Leiter von Wöhrl, zeigt uns die Anforderungen an eine Planungslösung und die Lösungsansätze.

Anschließend stellt uns Herr Westphal, Leiter Consulting der Firma Bissantz, die Möglichkeiten vor, Planungssysteme mit dem SQL Server 2005/2008 zu realisieren.
Der Schwerpunkt liegt hierbei auf dem Vergleich relationaler und multidimensionaler Ansätze zur Lösung von typischen Aspekten von Planungslösungen.

Vorstellung der Referenten:
Marcus Kresin leitet seit Anfang 2009 bei der Rudolf Wöhrl AG den Bereich Business Intelligence (BI). Er arbeitete zuvor im internationalen Luftfahrtbereich und seine Aufgaben lagen dort in der Optimierung von Prozessen im Operativen- und Finanzsektor mit der Hilfe von Software- und Datenbanklösungen.

Michael Westphal, Leiter Consulting der Firma Bissantz, beschäftigt sich seit Jahren intensiv mit der Konzeption und Realisation von BI- und Planungslösungen mit dem SQL Server. In einer Vielzahl von Projekten hat er einen tiefen Einblick in die unterschiedlichen Kundenanforderungen, Vorgehensweisen und Lösungsmöglichkeiten bekommen.

Gastgeber ist diesmal wieder die New Elements GmbH (Äußere-Bayreuther-Straße. 55, 90409 Nürnberg).

Und wie jedes Mal so ist auch diesmal der Eintritt frei, auch Nicht-Mitglieder sind herzlich eingeladen. Bitte dennoch bei Michael Deinhard unter M.Deinhard(ät)newelements.de oder Klaus Oberdalhoff unter kob(ät)sqlpass.de anmelden, damit man die Anzahl der benötigten Stühle abgeschätzt werden kann.

Mehr Infos hier.

4. Januar 2010 um 19:28

Mit Elster einen Mini gewinnen

Man glaubt es kaum, aber das bayerische Finanzamt verlost unter allen Steuerzahlern einen Mini Cooper… Das ist mal eine kreative Maßnahme zur Motivation der Abgabe, denn man kann nur teilnehmen, wenn man seine Steuererklärung bis Ende Mai abgegeben hat.

3. Januar 2010 um 11:13

Vorsicht bei Cursor auf TVF/View mit PIVOT

Kürzlich wurde der kummulative Update 7 (CU7) für den SQL Server 2005 SP3 veröffentlicht. Darin wird ein Problem beseitig, das man nur schwer entdecken kann, wenn man betroffen ist: Bei einem Cursor auf eine View oder eine Table-Valued-Fumction kann der Cursor falsche Ergebnisse liefern. Hier ein Repro, dass auch mit SQL Server 2008 funktioniert:

SET NOCOUNT ON;
go
USE tempdb
go
BEGIN TRY DROP TABLE dbo.tg_table1 END TRY BEGIN CATCH END CATCH;
BEGIN TRY DROP TABLE dbo.tg_table2 END TRY BEGIN CATCH END CATCH;
BEGIN TRY DROP FUNCTION dbo.f_PivotAndOuterJoin END TRY BEGIN CATCH END CATCH;
go
– create table 1
SELECT cy, value, type
INTO dbo.tg_table1
FROM ( SELECT 2002, 1, 3 UNION ALL
SELECT 2003, 1, 3 UNION ALL
SELECT 2004, 1, 3 UNION ALL
SELECT 2005, 1, 3 UNION ALL
SELECT 2006, 1, 3 UNION ALL
SELECT 2007, 1, 3 UNION ALL
SELECT 2008, 1, 3 UNION ALL
SELECT 2009, 1, 3 UNION ALL
SELECT 2008, 1, 3 UNION ALL
SELECT 2009, 1, 3) AS x(cy, value, type);
go
– create table 2
SELECT cy
INTO dbo.tg_table2
FROM ( SELECT 2003 UNION ALL
SELECT 2004 UNION ALL
SELECT 2005 UNION ALL
SELECT 2006 UNION ALL
SELECT 2007 UNION ALL
SELECT 2008) AS x(cy);

CREATE CLUSTERED INDEX c_1 ON dbo.tg_table2 (cy);
go
CREATE FUNCTION dbo.f_PivotAndOuterJoin ()
RETURNS TABLE AS
RETURN
SELECT d.cy, [3] AS value
FROM tg_table1 AS t1
PIVOT ( MAX(value) FOR t1.type in ([3]) ) AS d
LEFT OUTER JOIN dbo.tg_table2 AS t2
ON d.cy=t2.cy

go

DECLARE @year int;

PRINT 'wrong results:';

DECLARE cCursor CURSOR FOR
SELECT cy FROM dbo.f_PivotAndOuterJoin() ORDER BY cy;

OPEN cCursor;
FETCH NEXT FROM cCursor INTO @year;

WHILE @@FETCH_STATUS = 0 BEGIN
PRINT convert(varchar, @year);

FETCH NEXT FROM cCursor INTO @year;
END
CLOSE cCursor;
DEALLOCATE cCursor;

PRINT ' '; – only to get an empty line
go
DECLARE @year int;

PRINT 'correct result (with STATIC cursor):';

– STATIC, FAST_FORWARD, or READ_ONLY are OK,
– but FORWARD_ONLY, DYNAMIC, SCROLL, or KEYSET are not OK
DECLARE cCursor CURSOR STATIC FOR
SELECT cy FROM dbo.f_PivotAndOuterJoin () ORDER BY cy;

OPEN cCursor;
FETCH NEXT FROM cCursor INTO @year;

WHILE @@FETCH_STATUS = 0 BEGIN
PRINT convert(varchar, @year);

FETCH NEXT FROM cCursor INTO @year;
END
CLOSE cCursor;
DEALLOCATE cCursor;

/* output:

wrong results:
2009
2004
2005
2006
2007
2008
2009

correct result (with STATIC cursor):
2002
2003
2004
2005
2006
2007
2008
2009
*/

Die genauen Bedingungen sind im KB-Artikel 976565 beschrieben:

# In Microsoft SQL Server 2005, you have a query that opens a cursor of type FORWARD_ONLY, DYNAMIC, SCROLL or KEYSET.
# The cursor is in an inline table-valued function or a view.
# The inline table-valued function or the view uses either a PIVOT operator or an UNPIVOT operator.
# In addition to the source table of the PIVOT or UNPIVOT operator, there is at least one other table that is referenced in the inline table-valued function or the view.

Alle Bedingungen müssen zutreffen. Meine intuitive Reaktion ist berechenbar: schon wieder ein Argument gegen Cursor. Aber leider gibt es immer noch einige Situationen in denen man unbedingt Cursor benötigt. Das oben gesagt trifft natürlich auch für client-seitige Cursor zu.

|