SQL Join Types

Relationale Datenbanken basieren auf dem Prinzip, dass man Daten miteinander in Verbindung setzt. Zum Beispiel hat 1 Auto (im Normalfall) 4 Räder. Um über eine Abfrage solche Beziehungen umzusetzen stehen JOINs zur Verfügung. Vor einiger Zeit bin ich hier auf eine schöne Übersicht gestoßen, die ich hier gern teilen möchte.

SQL Join Types weiterlesen

Verkleinerung (Shrink) von Logfiles unter MS-SQL

Selbst im SIMPLE-Wiederherstellungsmodell neigen die Dateien eines Transaction-Log dazu, gelegentlich groß zu werden und nehmen so nicht ganz unwesentlichen Server-Speicher in Anspruch. Klar, mag man da jetzt drüber argumentieren, dass es ja besser ist ein großes leeres Transaction-Log zu haben um im Falle nicht unnötige Zeit zu verschwenden.. Ich habe aber gern einen Überblick über wirklich in Verwendung stehenden Speicherplatz und lass die Files daher regelmäßig verkleinern.

Verkleinerung (Shrink) von Logfiles unter MS-SQL weiterlesen

SQL-Funktion – Ermittlung der Überlappung von 2 Zeiträumen

Ab und an geht es mal darum in einer Datenbank den Überlappungs-Zeitraum von 2 Zeiträumen zu ermitteln, oder auch nur ob 2 Zeiträume überhaupt überlappen. Heute stand ich vor dieser Problematik und habe auch keine eingebaute Funktion im MS-SQL-Server gefunden. Die folgenden 2 Funktionen, alle Angaben ohne Gewähr, führen jedenfalls bei mir zum gewünschten Ergebnis:

SQL-Funktion – Ermittlung der Überlappung von 2 Zeiträumen weiterlesen

ROLLBACK TRANSACTION bei Tabellen-Variablen

Im Zusammenhang mit der Entwicklung einer Cache-Logik bin ich auf ein kleines Problem gestoßen, auf dass ich hier kurz hinweisen möchte. Nehmen wir an, wir haben folgendes SQL-Skript:

  1. Leeren eines Tabelle
  2. Befüllen der Tabelle mit frischen Daten
Packt man die beiden Befehle (DELETE und INSERT) nicht in eine Transaktion, kann es passieren, dass man bei einem INSERT-Fehler auf einmal mit einer leeren Tabelle da steht (was ja nicht immer so gewollt ist). 
Also habe ich folgende erweiterte Logik umgesetzt:
  1. Erstelle eine Transaktion
    1. Leeren eines Tabelle
    2. Befüllen der Tabelle mit frischen Daten
  2. wenn beides ohne Probleme lief, dann festschreiben (COMMIT)
  3. wenn es ein Problem gab, Rückgängig machen (ROLLBACK)
In meinen Tests mit einer Tabellen-Variable (@table) wollte das aber partout nicht funktionieren und ich bin wahnsinnig geworden (fast jedenfalls). Eine Änderung der Tabelle von Variable auf Temp (also statt @table auf #table) und schon klappt alles.
In einem Blog-Post wurde mein Verdacht dann auch bestätigt: es geht einfach nicht. Rollback wird bei Tabellen-Variablen nicht unterstützt…

Gelöst: Datumsformat in SSRS-Parameter ändert sich nach Auswahl

Seit ein paar Wochen kämpfte ich mit einem kleinen, aber nervigen Problem. Die Ausgangslage:

  • Windows Server 2012 Englisch
  • Sharepoint Foundation 2013 Englisch
  • SQL Server 2012 mit Reporting Services (SSRS) im Sharepoint Modus (auch Englisch)
Das Problem: Ich habe mehrere Reports, die für deutschsprachige Nutzer gedacht sind, denen also das Datumsformat dd.mm.yyyy geläufiger ist als mm/dd/yyyy. Jetzt kam es in allen Reports immer dazu, dass man einen Datums-Parameter auswählt, mittels des kleinen Kalenders z.B. das Datum 01.03.2014 auswählte, mit dem Klick auf „Apply“ sich das Datumsformat, und somit auch der übermittelte Datums-Parameter in 01/03/2014, also den 3. Januar anstelle des 01. März veränderte.
Trotz aller Recherche, Einstellungen, etc.: es hilft nix. Glücklicherweise bin ich dann heute auf diesen Beitrag gestoßen: http://support.microsoft.com/kb/2764343/en-us. Dieser wiederum verwies auf ein Update-Pack, welches ich (dann im 3. Anlauf auch erfolgreich) runterladen konnte. Im Endeffekt, was mir dann geholfen hatte, war das aktuellste Update Pack für den SQL Server 2012 SP1: http://support2.microsoft.com/hotfix/KBHotfix.aspx?kbnum=2991533&kbln=de. Die aktuellste Übersicht findet man immer http://support.microsoft.com/kb/2772858/en-us.

MS-SQL-Script zur Darstellung aller Views in einer Datenbank

Neulich kam ich in die Verlegenheit ein Script bauen zu müssen, welches mir alle Views in einer MS-SQL-Datenbank zeigt, und für diese dann auch die jeweilige Anzahl an Zeile ausgibt.

set nocount on
declare @ObjectName varchar(100)
declare objectcursor cursor for
select
TABLE_NAME
from information_schema.tables
where 1=1
and table_type = ‚VIEW‘
and table_name not like ’syncob%‘
and table_name not like ‚vvZZ%‘
order by table_name desc
open objectcursor
fetch next from objectcursor into @ObjectName
while @@fetch_status = 0
begin
print @ObjectName + ‚ testing starting‘
declare @start datetime = getdate()
declare @sql nvarchar(300) = ’select count(*) from [‚ + @ObjectName + ‚] with (nolock)‘
–print ‚ ‚ + @sql
exec sp_executesql @sql
declare @End datetime = getdate()
declare @Duration int = datediff(ms, @Start, @End)
print @ObjectName + ‚ testing completed, Duration: ‚ + convert(varchar, @Duration) + ‚ ms‘
fetch next from objectcursor into @ObjectName
end
close objectcursor
deallocate objectcursor

SQL-Script zur Änderung des Wiederherstellungsmodells

Hallo,

ein kleines, aber feiner Script, welches dem Einen oder Anderen hilft, das Wiederherstellungsmodell vieler Datenbanken auf einem SQL-Server zu ändern (hier von FULL auf SIMPLE), und dabei auch noch die (nicht mehr benötigten) Log-Dateien verkleinert:

declare @DatabaseName varchar(max)
declare @string varchar(max)
 
declare my_cursor cursor
local static read_only forward_only
for
select name from sys.databases where database_id > 11 and recovery_model = 1 and state = 0
order by database_id
open my_cursor
fetch next from my_cursor into @DatabaseName
while @@Fetch_status = 0
Begin
print @DatabaseName 
set @string = ‚alter database ‚ + quotename(@DatabaseName) + ‚ set recovery simple‘
exec (@string)
set @string = ‚use ‚ + quotename(@DatabaseName) + ‚ DBCC SHRINKFILE (2)‘
exec (@string)
fetch next from my_cursor into @DatabaseName
end
close my_cursor
deallocate my_cursor
 
Mit Hilfe des Scripts konnte ich das Recovery-Modell (welches ja standardmäßig von der modell-DB übernommen wird) bei 500+ DBs innerhalb 5 Minuten ändern und gleichzeitig noch 50GB Speicher freischaufeln.
 
Wichtige Elemente des Scripts sind
select name
from sys.databases where database_id > 11 and recovery_model = 1 and state = 0
order by database_id
Hierdurch werden alle DB-Namen gezogen, die in die Kriterien fallen. „recovery_modell = 1“ bedeutet FULL, „state = 0“ bedeutet, dass die DB Online ist.
Weiterhin wichtig
 
set @string = ‚alter database ‚ + quotename(@DatabaseName) + ‚ set recovery simple‘
exec (@string)
set @string = ‚use ‚ + quotename(@DatabaseName) + ‚ DBCC SHRINKFILE (2)‘
exec (@string)
 
Hierdurch wird zuerst für die DB das Wiederherstellungs-Modell auf SIMPLE gesetzt, dann wird die LOG-Datei geshrinked.
 
Betrachtet das Script als Baugrundgerüst, um ein Eigenes an eure Umgebung angepasstes zu entwickeln. Und ein paar Versuche in einer Test-Umgebung schaden natürlich auch nicht.
 
Viel Spaß