Overblog
Folge diesem Blog Administration + Create my blog
Blog von Olaf Helper

Datum von Ostern errechnen

30. März 2009 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

Im Netz gibt es viele Beispiele zum Errechnen des Ostersonntages; ein variabler Feiertag der „nach dem Mond“ geht, ebenso die Erläuterungen zur Formel, z.B. bei Wikipedia.


Hier nun die Umsetzung der Formel für den MS SQL Server mit einem T-SQL Script; das Ergebnis kann man z.B. mit der „
Osterfesttabelle“ von der „Physikalisch-Technischen Bundesanstalt“ vergleichen.

 
-- Alte Version ggf. DROPen
 IF OBJECT_ID (N'dbo.fnEasterSunday', N'FN') IS NOT NULL 
  DROP FUNCTION dbo.fnEasterSunday; 
 GO 
   
 CREATE FUNCTION dbo.fnEasterSunday(@Jahr smallint) 
  RETURNS datetime 
 AS 
 -- Autor: Olaf Helper 
 -- Stand: 30.03.2009 
 -- Typ: User Defined Function 
 -- Name: fnEasterSunday 
 -- Liefert zu einem Kalenderjahr das Datum von 
 -- Oster-Sonntag 
 BEGIN 
  DECLARE @a smallint, @b smallint, 
  @c smallint, @d smallint, 
  @e smallint, @o smallint, 
  @H1 smallint, @H2 smallint, 
  @N smallint, @M smallint 
   
  SET @a = @Jahr % 19; 
  SET @b = @Jahr % 4; 
  SET @c = @Jahr % 7 
  SET @H1 = @Jahr / 100; 
  SET @H2 = @Jahr / 400; 
  SET @N = 4 + @H1 - @H2; 
  SET @M = 15 + @H1 - @H2 - ((8 * @H1 + 13) / 25); 
  SET @d = (19 * @a + @M) % 30; 
  SET @e = (2 * @b + 4 * @c + 6 * @d + @N) % 7; 
  SET @o = 22 + @d + @e; 
   
  -- Ausnahmen 
  IF @o = 57 
  SET @o = 50; 
  IF (@d = 28) AND (@e = 6) AND (@a > 10)  
  SET @o = 49; 
   
  RETURN(DATEADD(d, @o - 1,  
  CONVERT(datetime, 
  CONVERT(char(4), @Jahr)  
  + '0301'))); 
 END; 
 GO 
   
 -- Kurzer Unit-Test = 23.03.2008 
 SELECT dbo.fnEasterSunday(2008) 
 GO 
Weiterlesen

Wie temporäre Tabellen auf Existenz prüfen?

30. März 2009 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

Temporäre Tabellen werden im MS SQL Server gerne verwendet, um kurzzeitig Zwischenergebnisse abzuspeichern und mit denen dann bequem mengenorientiert weiter arbeiten zu können.
Man unterscheidet bei den temporären Tabellen solche mit einem lokalen Gültigkeitsbereich (beginnen mit #), die man also nur in der eigenen, aktuellen Session verwenden kann und solche, die global, also auch in anderen Session verfügbar sind (beginnen mit ##). Ein Vorteil ist auch, das mit Beenden der Session (bei lokal temporäre) bzw. wenn keine Session mehr die (globale) temporäre Tabelle verwendet, diese automatisch wieder gelöscht wird.

Zur Fehlervermeidung prüft man vor Anlage einer (temporären) Tabelle, ob schon eine mit solchem Namen existiert. Es könnte ja sein, das in einem Script zur vor in der Session schon eine angelegt und vergessen wurde, diese explizit wieder zu Löschen; dann kommt es zum Laufzeitfehler.

Nur beim Überprüfen, ob eine solche existiert, ist etwas Wichtiges zu beachten. Legen wir zunächst mal 2 Tabellen an und überprüfen dann auch mittels ein T-SQL Script auf dem einfachen Weg:

 
USE
[AdventureWorks]
 GO 
 -- Temporäre Tabelle Lokal+Global anlegen 
 CREATE TABLE #Local ([ID] int); 
 CREATE TABLE ##Global([ID] int); 
 GO 
 -- Liefert kein Ergebnis 
 SELECT OBJECT_ID('#Local') AS LocID, 
  OBJECT_ID('##Global') AS GlobID; 
 -- Oder selektierbar? 
 SELECT name, object_id FROM sys.tables 
 WHERE name IN ('#Local', '##Global'); 


Die Abfrage der Object_ID() liefert NULL, die Selektion auf die Tabellen liefert keinen Datensatz, obwohl es die Tabellen ja nun gibt.

Kurz nachgedacht ist es klar, temporäre Objekte werden nicht in der aktuell verwendeten Datenbank angelegt, sondern immer in der Systemdatenbank „tempdb“. Also müssen wir mal da nachsehen.

 
-- Das liefert die ID-Abfrage:
 SELECT OBJECT_ID('tempdb..#Local') AS LocID, 
  OBJECT_ID('tempdb..##Global') AS GlobID; 


Das liefert uns nun eine Object_ID(), natürlich bezogen auf die tempdb. Kann man dort nun auch die Tabellen über sys.tables oder sys.objects selektieren? Fast. Um es kurz zu machen, selektiere ich gleich mit LIKE.

 
-- Auch selektierbar?
 SELECT name FROM tempdb.sys.tables 
 WHERE name LIKE '#Local%' 
  OR name like '##Global%' 


Das Ergebnis sieht dann als Beispiel so aus:
  

 name 
------------------------------------------------------------------- #Local_________________________________________________000000000023
 ##Global 


(Der #Local Eintrag ist gekürzt, insgesamt sind es eigentlich 128 Zeichen).

Unerwartetes Ergebnis?
Eigentlich ist es klar, eine lokal temporäre Tabelle ist nur in einer Session gültig und vom Namen her auch nur in der Session eindeutig. Andere Sessions können ihrerseits ebenfalls lokale Tabellen mit dem Namen anlegen und die müssen verwaltet werden können.
Der HEX-Wert als Suffix ist unabhängig von der Session, es ist eine fortlaufende Identity, die erst mit dem SQL Server Neustart wieder zurückgesetzt wird. Der ##Global Eintrag hat kein Suffix, da aus allen Sessions darauf zugegriffen werden kann und somit der Name auch für alle unique sein muss.

 

Fazit:

Die einzig funktionierende Möglichkeit auf die Existenz zu prüfen und wenn vorhanden, die temporäre Tabelle zu löschen ist:

 
IF
NOT OBJECT_ID('tempdb..#Local') IS NULL
  DROP TABLE #Local; 
 IF NOT OBJECT_ID('tempdb..##Global') IS NULL 
  DROP TABLE ##Global;
GO
Weiterlesen

ISO Kalenderwoche in ein Datum umrechnen

29. März 2009 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

Nach dem Thema für den MS SQL Server, wie man als T-SQL Script ein Datum in eine Kalenderwoche (1) / (2) umrechnet, kommen wir nun zum umgekehrten Weg. Man hat eine ISO Woche + Jahr und möchte dazu einen Tag aus dieser ermitteln. Voraussetzung ist, dass die Funktion fnDate2ISOYearWeek angelegt ist.
Das Umrechnen ist recht einfach, man ermittelt zu einem Datum eine Referenzwoche aus dem Jahr, und rechnet die Differenz aus gesuchter und der Referenzwoche mal 7 Tage, addiert das aufs Referenzdatum und dann noch den Offset für den gewünschten Wochentag. Sieht dann so aus:

 
-- Alte Version ggf. DROPen
 IF OBJECT_ID (N'dbo.fnISOYearWeek2Date', N'FN') IS NOT NULL 
  DROP FUNCTION dbo.fnISOYearWeek2Date; 
 GO 
   
 CREATE FUNCTION dbo.fnISOYearWeek2Date 
  (@ISOYear int,  
  @ISOWeek smallint, 
  @WeekDay smallint) 
  RETURNS datetime 
 AS 
 -- fnISOYearWeek2Date - Stand 23.03.2009 
 -- Liefert zu ISO Kalenderwoche und -Jahr 
 -- das Datum des übergebenen Wochentages 
 -- Parameter: 
 -- @WeekDay: 1 = Montag ... 7 = Sonntag 
 -- Voraussetzung:  
 -- dbo.fnDate2ISOYearWeek 
 BEGIN 
  DECLARE @RefDate datetime, 
  @RefISOWeek int, 
  @DiffDay smallint, 
  @Result datetime 
   
  -- Validierung der Parameter 
  -- Bei datetime kann Jahr nur zwischen 1753 und 9999 liegen 
  IF @ISOYear BETWEEN 1753 AND 9999 
  -- Woche kann nur zwischen 1 und 53 liegen 
  AND @ISOWeek BETWEEN 1 AND 53 
  -- Wochentag kann nur zwischen 1 und 7 liegen 
  AND @WeekDay BETWEEN 1 AND 7 
  BEGIN 
  --Als Referenzdatum den 01. Feb des ISO Jahres 
  SET @RefDate = CONVERT(datetime, CONVERT(char(4), @ISOYear) + '0201'); 
  SET @RefISOWeek = dbo.fnDate2ISOYearWeek(@RefDate) % 100; 
   
  SET @DiffDay = 7 * (@ISOWeek - @RefISOWeek)  
  - DATEPART(DW, @RefDate)  
  + @WeekDay; 
  SET @Result = DATEADD(d, @DiffDay, @RefDate); 
  END 
  ELSE 
  -- Ungültiger Parameter, also kein Ergebnis 
  SET @Result = NULL; 
   
  RETURN(@Result);  
 END; 
 GO 
   
 -- Unit-Test 
 SELECT ISOJahr, ISOWoche,  
  dbo.fnISOYearWeek2Date(ISOJahr, IsoWoche, 1) 
 FROM (SELECT 2004 AS IsoJahr, 53 AS IsoWoche UNION 
  SELECT 2005 AS IsoJahr, 1 AS IsoWoche UNION 
  SELECT 2005 AS IsoJahr, 52 AS IsoWoche UNION 
  SELECT 2006 AS IsoJahr, 1 AS IsoWoche UNION 
  SELECT 2006 AS IsoJahr, 53 AS IsoWoche  
  ) AS Quelle 
 ORDER BY IsoJahr, IsoWoche 
Weiterlesen

Dynamische Verwendung von Bildern im Reporting Services

29. März 2009 , Geschrieben von Olaf Helper Veröffentlicht in #Reporting

In Reports mit dem MS SQL Server - Reporting Services zu Artikellisten möchte man zuweilen gerne zugehörige Bilder anzeigen lassen,  ähnlich wie in einem Katalog. Eine Variante der Bildablage ist es als BLOB in der Datenbank selbst, die andere ist das Speichern des Dateinamen nebst Ablageordner. Dabei gibt es aber etwas zu beachtet

-  Der Account, unter dem der „SQL Server Reporting Services“  Dienst läuft, muss natürlich zumindest Lesezugriff auf die Bild-Dateien habe.

-  Der Dateiname + Pfad muss als URL mit file://... angegeben werden.


Hier dazu ein Beispiel mit Bilder aus dem lokalen Windows-Verzeichnis; habe ich nur auf meinem Arbeitsplatzrechner getestet und nicht auf einem Server; aber auch dort sollten sich Bilder finden lassen.


Zunächst einmal eine Demo-Tabelle mit ein paar Datensätze:

 
CREATE
TABLE [dbo].[Bilder](
  [ID] [int] IDENTITY(1,1) NOT NULL, 
  [Bild] [varchar](255) NULL 
 ) ON [PRIMARY] 
 GO 
 INSERT INTO Bilder VALUES ('file://C:\Windows\Web\Wallpaper\img1.jpg'); 
 INSERT INTO Bilder VALUES ('file://C:\Windows\Web\Wallpaper\img2.jpg'); 
 INSERT INTO Bilder VALUES ('file://C:\Windows\Web\Wallpaper\img3.jpg'); 
 GO 


Nun im BIDS einen neuen Report mit der Tabelle als DataSet anlegen, eine Liste oder Tablix als Control auf den Report platzieren, die Felder „ID“ und „Bild“ dort einfügen; eigentlich mehr zur Kontrolle. Dann eine weitere Spalte einfügen und in die ein „Bild“ Control reinziehen. In den Bildeigenschaften gibt man dann noch folgendes an

-  Bildquelle auswählen = Extern

-  Diese Bild verwenden = [Bild]  (also der Feldname aus dem DataSet)

Das war es schon.


Weiterlesen

Datum in ISO Kalenderwoche (2)

29. März 2009 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

Noch einmal das Thema „Datum in ISO Kalenderwoche“ für den MS SQL Server, dieses Mal ein T-SQL Script als „Table Value Function“ ausgelegt. Verwendet kann es dann als Tabelle mittels

CROSS APPLY

      dbo.fnDate2ISOYearWeekTable(SRC.DATUM) AS ISO

 

Hier das Script für die Funktion:

 
-- Alte Version ggf. DROPen
 IF OBJECT_ID (N'dbo.fnDate2ISOYearWeekTable', N'TF') IS NOT NULL 
  DROP FUNCTION dbo.fnDate2ISOYearWeekTable; 
 GO 
   
 CREATE FUNCTION dbo.fnDate2ISOYearWeekTable(@Date datetime) 
  RETURNS @Result TABLE  
  (ISOYear int NOT NULL, 
  ISOWeek smallint NOT NULL) 
   
 WITH EXECUTE AS CALLER 
 AS 
 -- fnDate2ISOYearWeekTable - Stand 23.03.2009 
 -- Liefert zu einem Datum die Kalenderwoche und -Jahr 
 -- als Tabelle 
 BEGIN 
  DECLARE @ISOweek smallint, 
  @ISOYear int; 
   
  SET @ISOYear = DATEPART(yy, @Date); 
  SET @ISOweek = DATEPART(wk, @DATE) + 1 
  - DATEPART(wk, CAST(@ISOYear as CHAR(4)) + '0104'); 
   
  -- Sonderfall: Erste KW <> 4 Tage 
  IF (@ISOweek = 0)  
  BEGIN 
  SET @ISOYear = @ISOYear - 1; 
  SET @ISOweek = DATEPART(wk, CAST(@ISOYear AS CHAR(4)) 
  + '12'  
  + CAST(24 + DATEPART(DAY, @DATE) AS CHAR(2)) 
  ) + 1 
  - DATEPART(wk, CAST(@ISOYear as CHAR(4)) + '0104') 
  + 1; 
  END; 
   
  --Sonderfall: Letzte 3 Tage falen in erste KW Folgejahr 
  IF DATEPART(mm, @DATE) = 12  
  AND DATEPART(dd, @DATE) - DATEPART(dw, @DATE) >= 28 
  BEGIN 
  SET @ISOweek = 1; 
  SET @ISOYear = @ISOYear + 1; 
  END; 
   
  INSERT INTO @Result 
  VALUES (@ISOYear, @ISOWeek); 
  RETURN; 
 END; 
 GO 
   
 -- Unit-Test mit Sonder- und Normalfällen 
 SELECT Datum, DATENAME(dw, Datum) AS WochenTag, 
  DATENAME(isowk, Datum) AS InternalIsoWeek,  
  dbo.ISOweek(Datum) AS MSIsoWeek, 
  ISO.ISOYear, ISO.ISOWeek 
 FROM (SELECT CAST('20060101' as datetime) AS DATUM UNION 
  SELECT CAST('20060102' as datetime) AS DATUM UNION 
  SELECT CAST('20061231' as datetime) AS DATUM UNION 
  SELECT CAST('20050101' as datetime) AS DATUM UNION 
  SELECT CAST('20050102' as datetime) AS DATUM UNION 
  SELECT CAST('20050103' as datetime) AS DATUM  
  ) AS SRC 
  CROSS APPLY 
  dbo.fnDate2ISOYearWeekTable(SRC.DATUM) AS ISO 
 ORDER BY DATUM  
Weiterlesen

Datum in ISO Kalenderwoche (1)

29. März 2009 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

Im Bereich der Waren-, Lagerwirtschaft und Disposition arbeitet man in der Regel eher mit der Kalenderwoche statt mit einem fixen Datum; natürlich bevorzugt im der Kalenderwoche nach ISO Norm.

Bis einschließlich dem Microsoft SQL Server 2005 gab es kein Bordmittel zum Umrechnen in die ISO-KW, man fand aber in der BOL unter dem Thema CREATE FUNCTION (Transact-SQL)“ im Beispiel A. ein Script für eine benutzerdefinierte Funktion „ISOWeek“, mit der man umrechnen kann.

Im MS SQL Server 2008 hat die ISO Woche nun auch im Standard Einzug gehalten mit dem Parameter ISO_WEEK / ISOWK / ISOWW für die Funktion DATEPART:

 
SELECT
DATEPART(ISOWK,
  CAST('20060101' AS datetime)) AS IsoWeek 


Was mich aber an den Funktionen stört, ist das das Jahr nicht mitgeliefert bzw. das ich bei dem Beispiel mit dem 2006-01-01 darauf achten muss, das die resultierende KW 52 ins Jahr 2005 fällt, nicht in 2006.

Ich habe mir deshalb auf Basis der ISOWeek Funktion eine eigene erstellt, die es mir im Format YYYYWW als Integer zurückliefert. Das auf splitten in ein separates Jahr / Woche ist dann leicht.

 SELECT dbo.fnDate2ISOYearWeek(GetDate()) / 100 AS Jahr, 
  dbo.fnDate2ISOYearWeek(GetDate()) % 100 AS Woche  


Hier das Anlage-Script für die Funktion
fnDate2ISOYearWeek

 
-- Alte Version ggf. DROPen
 IF OBJECT_ID (N'dbo.fnDate2ISOYearWeek', N'FN') IS NOT NULL 
  DROP FUNCTION dbo.fnDate2ISOYearWeek; 
 GO 
   
 CREATE FUNCTION dbo.fnDate2ISOYearWeek(@Date datetime) 
  RETURNS int 
 AS 
 -- fnDate2ISOYearWeek - Stand 23.03.2009 
 -- Liefert zu einem Datum die Kalenderwoche und -Jahr 
 -- nach ISO im Format YYYYWW als Integer  
 BEGIN 
  DECLARE @ISOweek smallint, 
   @ISOYear int;  
  SET @ISOYear = DATEPART(yy, @Date); 
  SET @ISOweek = DATEPART(wk, @DATE) + 1 
  - DATEPART(wk, CAST(@ISOYear as CHAR(4)) + '0104'); 
   
  -- Sonderfall: Erste KW <> 4 Tage 
  IF (@ISOweek = 0)  
  BEGIN 
  SET @ISOYear = @ISOYear - 1; 
  SET @ISOweek = DATEPART(wk, CAST(@ISOYear AS CHAR(4)) 
  + '12'  
  + CAST(24 + DATEPART(DAY, @DATE) AS CHAR(2)) 
  ) + 1 
  - DATEPART(wk, CAST(@ISOYear as CHAR(4)) + '0104') 
  + 1; 
  END; 
   
  --Sonderfall: Letzte 3 Tage falen in erste KW Folgejahr 
  IF DATEPART(mm, @DATE) = 12  
  AND DATEPART(dd, @DATE) - DATEPART(dw, @DATE) >= 28 
  BEGIN 
  SET @ISOweek = 1; 
  SET @ISOYear = @ISOYear + 1; 
  END; 
   
  RETURN(@ISOYear * 100 + @ISOweek); 
 END; 
 GO 
   
 -- Unit-Test mit Sonder- und Normalfällen 
 SELECT Datum, DATENAME(dw, Datum) AS WochenTag, 
   DATENAME(isowk, Datum) AS InternalIsoWeek,  
  dbo.ISOweek(Datum) AS MSIsoWeek, 
  dbo.fnDate2ISOYearWeek(Datum) AS myIsoYearWeek 
 FROM (SELECT CAST('20060101' as datetime) AS DATUM UNION 
  SELECT CAST('20060102' as datetime) AS DATUM UNION 
  SELECT CAST('20061231' as datetime) AS DATUM UNION 
  SELECT CAST('20050101' as datetime) AS DATUM UNION 
  SELECT CAST('20050102' as datetime) AS DATUM UNION 
  SELECT CAST('20050103' as datetime) AS DATUM  
  ) AS DatumsQuelle 
 ORDER BY DATUM 
Weiterlesen

Windows Internet Explorer 8

20. März 2009 , Geschrieben von Olaf Helper

Der Windows Internet Explorer 8 ist aus der Beta / CTP Phase raus, es gibt ihn nun als offiziellen Download:
http://www.microsoft.com/germany/windows/internet-explorer/default.aspx
Wer will noch mal, wer hat noch nicht? :-)

Weiterlesen

Cumulative update package 4 for SQL Server 2008

18. März 2009 , Geschrieben von Olaf Helper Veröffentlicht in #Download MSSQL

Das Service Pack 1 lässt noch etwas auf sich warten, es gibt es bisher nur als CTP. Gestern wurde aber das Cumulative update package 4 for SQL Server 2008 (CU#4) veröffentlicht.

Weiterlesen

T-SQL Passwort Generator Nr. 1

16. März 2009 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

WebShops, Forum und wo man sich sonst noch anmelden kann, der User aber nicht selbst ein Passwort vorgeben kann (gibt es sowas noch?), das muss ein Passwort vorgegeben werden. Das kann über die Business Logic des Backends erfolgen oder: Über den MS SQL Server per Stored Procedure in T-SQL.
Aber eigentlich nur eine Fingerübung für mich; hier also das SQL Script für einen Passwort Generator.

 -- Alte vorhandene Version löschen 
 IF NOT OBJECT_ID('dbo.spGeneratePassword1') IS NULL 
   DROP PROCEDURE dbo.spGeneratePassword1; 
 GO 
   
 -- Autor: Olaf Helper 
 -- Stand: 16.03.2009 
 -- Typ:  Stored Procedure 
 -- Name:  spGeneratePassword1 
 -- 
 CREATE PROCEDURE dbo.spGeneratePassword1 
  @Password AS varchar(128) OUTPUT, 
  @MinLen AS tinyint = 8, 
  @MaxLen AS tinyint = 128, 
   @WithLowLetters AS bit = 1, 
  @WithUpLetters AS bit = 1, 
  @WithDigits AS bit = 1, 
  @WithSigns AS bit = 1 
 AS 
 BEGIN 
  DECLARE @signs varchar(128); 
  DECLARE @useLen smallint; 
  DECLARE @len smallint; 
  DECLARE @loop smallint; 
  DECLARE @pos smallint; 
   
  -- Parameter-Validierung 
  IF @MinLen < 2 OR @MinLen > @MaxLen OR @MaxLen > 128 
   RAISERROR (N'Invalid pwd length range', 10, 1); 
  IF @WithLowLetters = 0 AND @WithUpLetters = 0 AND @WithDigits = 0 AND @WithSigns = 0 
   RAISERROR (N'No signs for pwd defined', 10, 1); 
   
   -- Set der verwendbaren Zeichen setzen 
  SET @signs = ''; 
   IF @WithLowLetters = 1 
   SET @signs = @signs + 'abcdefghijklmnopqrstuvwxyz'; 
  IF @WithUpLetters = 1 
   SET @signs = @signs + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
  IF @WithDigits = 1 
   SET @signs = @signs + '0123456789'; 
  IF @WithSigns = 1 -- Nur nicht-reservierte Zeichen 
   SET @signs = @signs + '!§$&/=?@*+~#-:<>^°'; 
  SET @len = LEN(@signs); 
   
  -- Wieviele Zeichen nun wirklich 
  IF @MinLen = @MaxLen 
   SET @useLen = @MinLen; 
  ELSE 
   SET @useLen = @MinLen + (RAND() * (@MaxLen - @MinLen)); 
   
  -- Passwort zusammenbauen 
  SET @loop = 0; 
  SET @Password = ''; 
  WHILE @loop < @useLen 
  BEGIN 
   SET @pos = 1 + (RAND() * (@len - 1)); 
   SET @Password = @Password + SUBSTRING(@signs, @pos, 1); 
   SET @loop = @loop + 1; 
  END;   
 END; 
 GO 


Funktioniert es auch? Machen wir den Test:

 -- Unit-Test; Passwörter generieren lassen 
 DECLARE @loop int, @Password varchar(128); 
   
 SET @loop = 0; 
 WHILE @loop < 20 
 BEGIN 
  -- Mit DEFAULTS abrufen 
  EXEC dbo.spGeneratePassword1 @Password OUTPUT; 
  SELECT @Password; 
  SET @loop = @loop + 1; 
 END; 
 GO 

 
Weiterlesen

Free eBook: Microsoft SQL Server 2008 Step by Step

14. März 2009 , Geschrieben von Olaf Helper Veröffentlicht in #Free eBooks

Bei ActiveReader.Org gibt es das Buch "Microsoft SQL Server 2008 Step by Step" von Mike Hotek aus dem Microsoft Press Verlag als CHM Datei zum Download.

Weiterlesen
1 2 > >>