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

Microsoft TechDays Februar 2009

30. Dezember 2008 , Geschrieben von Olaf Helper Veröffentlicht in #Event

Bei den TechDays Veranstaltungen im Februar „Best Practice Day“ gibt es unter anderem auch den Vortrag „Grundlagen der SQL Server Administration für den Teilzeit-DBA“ von Steffen Krause.

Weiterlesen

Runden ist Definitionssache

30. Dezember 2008 , Geschrieben von Olaf Helper Veröffentlicht in #.NET

Noch mal zum Runden in VB 6.0 / Visual Basic.NET und MS SQL Server:

Der Round-Befehl in VB rundet mathematisch und im MS SQL Server kaufmännisch. Definition siehe hier:

http://de.wikipedia.org/wiki/Runden

Weiterlesen

Microsoft SQL Server 2008 Certification Paths

30. Dezember 2008 , Geschrieben von Olaf Helper Veröffentlicht in #MSSQL

Microsoft hat zum MS SQL Server 2008 die Zertifizierungsmöglichkeiten zum MCTS und MCIP als PDF Datei veröffentlicht; der MCDBA fehlt aber.

Alles im allen ist es wie beim SQL Server 2005 geblieben:

http://download.microsoft.com/download/6/3/7/6370c653-e270-4e23-9685-15043f63dcce/SQLServer2008_CertPath_Complete.pdf

 

Siehe auch

http://www.microsoft.com/learning/mcp/sql/2008/default.mspx

Weiterlesen

Free eBook: SQL Server 2008 Transact-SQL Recipes

30. Dezember 2008 , Geschrieben von Olaf Helper Veröffentlicht in #Free eBooks

Das Buch „SQL Server 2008 Transact-SQL Recipes: A Problem-Solution Approach” vom aPress Verlag gibt es als kostenlosen Download im PDF Format unter

http://knowfree.net/2008/12/29/sql-server-2008-transact-sql-recipes-a-problem-solution-approach.kf

Weiterlesen

Executionplan mit Missing Index

30. Dezember 2008 , Geschrieben von Olaf Helper Veröffentlicht in #MSSQL

Seit MS SQL Server 2005 gibt es die DMV sys.dm_db_missing_index_... , wo mitprotokolliert wird, „ja wenn ich den Index gehabt hätte, dann wäre ich soundso schneller gewesen“.

Lässt man im SSMS 2008 den „Tatsächlichen Ausführungsplan einschließen“, dann wird man nun dort ebenfalls ganz dezent drauf hingewiesen, das man einen Index zur Performance-Verbesserung anlegen könnte … ein Vorlage-Script wird sogar gleich mitgeliefert.
Gute Verbesserung, wie ich finde.

Weiterlesen

MS SQL Server und das kaufmännische Runden

30. Dezember 2008 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

Kleiner Nachtrag, wer es gelesen hat (nicht, das ich darauf herum reiten will). Der MS SQL Server ist schlauer ("kaufmännischer", sofern es das Wort überhaupt gibt) als VB.NET, der kann richtig runden  :

 

SELECT ROUND(1.5, 0), ROUND(2.5,0), ROUND(3.5, 0)

 

Ergebnis:

------------- ------------- -------------

2.0           3.0           4.0

 

(1 Zeile(n) betroffen)

 
Was sagt uns das? Mircosoft ist schlauer als Microsoft (oder doch nicht)?

Weiterlesen

Workaround zur MS SQL Server Sicherheitslücke KB961040

29. Dezember 2008 , Geschrieben von Olaf Helper Veröffentlicht in #MSSQL

Um schnell Hilfe zu bieten und die Sicherheitslücke (siehe Blog-Eintrag) zu Schließen hat Microsoft einen Workaround in KB961040 veröffentlicht: 

http://support.microsoft.com/kb/961040

Weiterlesen

VB(.NET) und das kaufmännische Runden

29. Dezember 2008 , Geschrieben von Olaf Helper Veröffentlicht in #.NET

Das "Problem" gibt es wohl seit Urzeit in VB und in VB.NET ist es immer noch drin: VB kann nicht kaufmänisch runden. Beispiel:

 Module MainModul 
  Sub Main() 
  'Runden mit Double 
  Debug.Print(System.Math.Round(1.5D, 0).ToString) ' = 2 (korrekt) 
  Debug.Print(System.Math.Round(2.5D, 0).ToString) ' = 2 (falsch) 
  Debug.Print(System.Math.Round(3.5D, 0).ToString) ' = 4 (korrekt) 
  Debug.Print(System.Math.Round(4.5D, 0).ToString) ' = 4 (falsch) 
  'Runden mit Decimal; auch nicht besser 
  Debug.Print(Decimal.Round(Convert.ToDecimal(1.5D), 0).ToString) ' = 2 (korrekt) 
  Debug.Print(Decimal.Round(Convert.ToDecimal(2.5d), 0).ToString) ' = 2 (falsch) 
   End Sub 
 End Module 

 

Der Grund ist einfach, das die Funktion "mathematisch" rundet und eben nicht "kaufmännisch". Und ärgerlich ist es schon, dass man das immer im Hinterkopf behalten muss; ich kenne kein Anwendungsgebiet, wo das so gewünscht ist. 

Workaround ist eine eigene Funktion zum Runden: 

  Public Function myRound(ByVal d As Decimal, ByVal decimals As Integer) As Decimal 
  'Kaufmännisch korrekt runden 
  Dim power As Long 
   
  power = 10 ^ decimals 
  myRound = (d * power + 0.5 * System.Math.Sign(d)) / power 
  End Function 

 

Test: 

  Debug.Print(myRound(1.5D, 0).ToString) ' = 2 
  Debug.Print(myRound(2.5D, 0).ToString) ' = 3 
  Debug.Print(myRound(3.5D, 0).ToString) ' = 4 
  Debug.Print(myRound(-1.5D, 0).ToString) ' = -2 

 

Klappt!

Weiterlesen

Übersetzung von Datumsbezeichnungen

29. Dezember 2008 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

In manchen Projekten braucht man zumindest für die Anzeige im Client die Übersetzung von Datumsbezeichnungen, zum Beispiel in Business Intelligence Projekten. Im MS SQL Server gibt es schon die Möglichkeit, sich die Bezeichnung in einer bestimmten Sprache ausgeben zu lassen, indem man zu der Sprache wechselt:

 SET NOCOUNT ON; 
 SET LANGUAGE English; SELECT DATENAME(mm, Getdate()), DATENAME(dw, Getdate()); 
 SET LANGUAGE French; SELECT DATENAME(mm, Getdate()), DATENAME(dw, Getdate()); 
 SET LANGUAGE Italian; SELECT DATENAME(mm, Getdate()), DATENAME(dw, Getdate()); 
 SET LANGUAGE Dansk; SELECT DATENAME(mm, Getdate()), DATENAME(dw, Getdate()); 

 

Ergebnis:

 Changed language setting to us_english. 
 ------------------------------ ------------------------------ 
 December Monday 
   
 Le paramètre de langue est passé à Français. 
 ------------------------------ ------------------------------ 
 décembre lundi 
   
 L'impostazione della lingua è stata sostituita con Italiano. 
 ------------------------------ ------------------------------ 
 dicembre lunedì 
   
 Changed language setting to Dansk. 
 ------------------------------ ------------------------------ 
 december mandag 

 

 

Welche Sprachen der MS SQL Server unterstützt findet man im VIEW:

 SELECT * 
 FROM sys.syslanguages 

 

Genau dort findet man auch die hinterlegten Übersetzungen, die man selbst nutzen kann, wenn man nicht immer die Sprache umstellen will, z.B. beim Initialen Aufbau einer Tabelle für die Zeithierarchie für BI / OLAP.

Nur wie? Ich habe mir eine kleine UDF als T-SQL Script dafür erstellt, die mir die Übersetzung ausliest; es gibt dabei keine große Logikprüfung oder Fehlerbehandlung. Verwendet wird für die Suche die LangID vom MS SQL Server, man kann es aber auch auf die LcId (Language Code ID) ändern, wie sie unter Windows verwendet wird (Deutsch: LangID = 1, LcId = 1031)

 -- Alte Version entfernen, sofern vorhanden 
 IF EXISTS (SELECT * FROM sysobjects WHERE type = 'FN' AND name = 'fnTranslateDateName') 
  DROP FUNCTION dbo.fnTranslateDateName 
 GO 
   
 -- Übersetzen von Datumsbezeichnungen 
 CREATE FUNCTION dbo.fnTranslateDateName 
  (@langid smallint, 
  @datepart smallint, -- 1 = Tag, 2 = Monat kurz, 3 = Monat lang 
  @datepartno smallint -- Nummer des gesuchten Datumsteil, z.B. 3 = März 
  ) RETURNS nvarchar(30) 
 BEGIN 
  DECLARE @sNames nvarchar(372); 
  DECLARE @sDateName nvarchar(30); -- Max für Tag/Monatsname 
  DECLARE @iNextPos smallint; 
  DECLARE @iLastPos smallint; 
  DECLARE @iLoop smallint; 
   
   IF @datepart = 1  
  SET @sNames = (SELECT days FROM sys.syslanguages 
  WHERE [langid] = @langid); 
  IF @datepart = 2 
  SET @sNames = (SELECT shortmonths FROM sys.syslanguages 
  WHERE [langid] = @langid); 
  IF @datepart = 3 
  SET @sNames = (SELECT months FROM sys.syslanguages 
  WHERE [langid] = @langid); 
  -- Überprüfung: Wurde Datumstext gefunden? 
  IF ISNULL(@sNames, '') <> '' AND (@datepart BETWEEN 1 AND 3)  
   AND (@datepartno BETWEEN 1 AND 31) 
  BEGIN 
  SET @iLoop = 1; 
  SET @iNextPos = 0; 
   
  WHILE @iLoop <= @datepartno 
  BEGIN 
  SET @iLastPos = @iNextPos; 
  SET @iNextPos = CHARINDEX(',', @sNames, @iNextPos + 1); 
  SET @iLoop = @iLoop + 1; 
  END 
  -- Wenn letzte Stelle gesucht wurde, war NextPos = 0 => Auf Endlänge setzen 
  IF @iNextPos = 0 AND @iLastPos <> 0  
  SET @iNextPos = LEN(@sNames) + 1; 
  SET @sDateName = SUBSTRING(@sNames, @iLastPos + 1, @iNextPos - @iLastPos - 1); 
  END 
  RETURN @sDateName; 
 END 
   
Weiterlesen

MS SQL Server 2008 und BACKUP LOG with TRUNCATE_ONLY / NO_LOG

29. Dezember 2008 , Geschrieben von Olaf Helper Veröffentlicht in #MSSQL

Sind die Datenbank mit Wiederherstellungsmodel = “Vollständig” konfiguriert, wächst die Transaktionsprotokoll Datei kontinuierlich an, bis zur nächsten LOG-Sicherung. Danach kann man das LOG mit SHRINKFILE verkleinern lassen.

Die "unsanftere" Methode dazu war bis zu MS SQL Server 2005 das „BACKUP LOG databasename WITH NO_LOG“, wobei NO_LOG ein Synonym zu TRUNCATE_ONLY ist.

Es bewirkte, dass zu dem Zeitpunkt das Transaktionsprotokoll abgeschnitten wird. Das hat wiederum zur Folge, dass an der Stelle auch die LOG Sicherungskette unterbrochen wurde. Im Falle des Falles hätte man nur die Sicherung bis vor dem Abschneiden verwenden können; genau so steht es in der Online Hilfe zum nachlesen.

Da genau das zu Verwirrungen & Problemen führte, gibt es die Option im MSSQL2008 nicht mehr. Wie man nun „unsanft“ das LOG abschneiden kann, steht ebenfalls in der BOL zum MS Sql Server 2008:
Wiederherstellungsmodel auf „Einfach“ stellen, LOG shrinken und gut.

Weiterlesen
1 2 3 > >>