XLDev.de

Next Level Development

mcts on sql server 2005 mcp on sql server 2000 1und1
Hier stelle ich meine "kleine" Sammlung von T-SQL Code Snippets für Microsoft SQL Server zu Verfügung. Die Skripts laufen in den meisten Fällen auf SQL Server >= 2005.
Weitere Vorschläge und/oder Anregungen nehme ich gerne entgegen.

Probleme mit Seiten- und Zeilenanzahl beheben

20.08.2010 posted by Frank Wenner

Nach einer Migration von SQL Server 2000 Datenbanken auf SQL Server >= 2005 kann es zu Problemen mit falschen Werte bei den Seiten- und Zeilenzahlen in den Katalogsichten geben. Diese Ungenauigkeiten können falsche Angaben über die Speicherplatzverwendung verursachen. Mit folgendem Statement werden diese Information für die angegebene Datenbank korrigiert.
DBCC UPDATEUSAGE (<MyDatabase>)

Snapshot-Isolation verwenden und aktivieren

20.08.2010 posted by Frank Wenner

Microsoft stellt ab SQL Server 2005 einen neuen Snapshot-Isolationsgrad bereit, um die Parallelität Anwendungen zu erhöhen. In früheren Versionen von SQL Server basierte diese Parallelität nur auf Sperren, wodurch in machen Anwendungen Probleme mit Deadlocks entstanden. Snapshot-Isolation beruht der Zeilenversionserstellung und soll durch das Vermeiden von Lese-Schreib-Blockierungen die Leistung steigern. Zur Aktivierung müssen die folgenden Statements ausgeführt werden.
-- der Datenbank SNAPSHOT_ISOLATION erlauben
ALTER DATABASE <MyDatabase> SET ALLOW_SNAPSHOT_ISOLATION ON

-- SNAPSHOT_ISOLATION als Default setzen
ALTER DATABASE <MyDatabase> SET READ_COMMITTED_SNAPSHOT ON

-- aktuellen Status abfragen
SELECT name, snapshot_isolation_state, is_read_committed_snapshot_on FROM sys.databases

einfaches Beispiel für einen Cursor (Schleife) mit T-SQL

11.04.2010 posted by Frank Wenner

Diese Beispielt zeigt die grundlegende Verwendung von datengebundenen Schleifen in T-SQL
DECLARE @NewID INT
DECLARE @OldID INT

  -- Cursor erstellen mit den SQL der Quelldaten
  DECLARE curKopieren CURSOR READ_ONLY FAST_FORWARD FOR
  SELECT ID FROM Tab1
  WHERE ID IN (1,2,3) -- Bedingung für die zu kopierenden Sätze (hier über die ID)
  
  -- Cursor öffnen und den ersten Satz lesen
  OPEN curKopieren
  FETCH NEXT FROM curKopieren INTO @OldID
  
  -- Solange Daten abgeholt werden konnten ...
  WHILE @@FETCH_STATUS = 0
  BEGIN
		  
    -- ersten Datensatz kopieren
    INSERT INTO Tab1 (Spalte1, Spalte2) 
    SELECT Spalte1, Spalte2 FROM Tab1 WHERE ID = @OldID
		  
    -- neue ID nach dem Insert abholen und merken
    SET @NewID = @@IDENTITY
		  
    -- zweiten Datensatz kopieren
    INSERT INTO Tab2 (IDTab1, Spalte1, Spalte2) 
    SELECT @NewID, Spalte1, Spalte2 FROM Tab2
    WHERE IDTab1 = @OldID
		  
    -- nächsten Satz lesen
    FETCH NEXT FROM curKopieren INTO @OldID
  END

  -- wichtig, unbedingt am Ende den Cursor schließen UND freigeben
  CLOSE curKopieren
  DEALLOCATE curKopieren

DateTime2SmallDateTime

11.04.2010 posted by Frank Wenner

Mit dieser Funktion können alle Werte auf einen Feld von Typ DateTime in einen Wert von Typ SmallDateTime umgewandelt werden
CREATE FUNCTION DateTime2SmallDateTime(@DateTime datetime) RETURNS smalldatetime AS
  BEGIN
  DECLARE @Result smalldatetime; SET @Result = null
  DECLARE @Year smallint; SET @Year = 0
  
  IF (NOT @DateTime IS NULL)
  BEGIN
    SET @Year = YEAR(@DateTime)
    IF  (@Year < 1900) BEGIN
      SELECT  @Result = dateadd(ss, datepart(ss,@DateTime),
                        dateadd(n, datepart(n,@DateTime),
                        dateadd(hh,datepart(hh,@DateTime),'01.01.1900')))
    END
    ELSE IF (@Year > 2076) BEGIN
      SELECT  @Result = dateadd(ss, datepart(ss,@DateTime),
                        dateadd(n, datepart(n,@DateTime),
                        dateadd(hh,datepart(hh,@DateTime),'06.06.2076')))
    END
    ELSE BEGIN
      SELECT  @Result = @DateTime
    END
  END
  RETURN @Result
END

Find the right art of your primary key

11.04.2010 posted by Frank Wenner

Vor einiger Zeit wurde ich in meinem Job mit der Frage vonfrontiert was denn der ideale Weg für einen Primärschlüssel für eine Tabelle auf Microsft® SQL Server ist. Es gibt hier die unterschiedlichsten Ansätze.
Ich habe hier mal die häufigsten Ansätze vergleichen.
  • manuelle vergebene Nummern
  • Identity Werte
  • GUID als Default
  • GUID manuell vergeben
mehr dazu gibt es hier

		
			

String2Numeric

11.04.2010 posted by Frank Wenner

Mit dieser Funktionen können Strings in Zahlen umgewandelt werden
CREATE FUNCTION String2Numeric(@Input varchar(max)) RETURNS INTEGER
BEGIN
  DECLARE @pos INTEGER
  SET @Pos = PATINDEX('%[^0-9]%',@Input)
  WHILE @Pos > 0
  BEGIN
    SET @Input = STUFF(@Input,@pos,1,'')
    SET @Pos = PATINDEX('%[^0-9]%',@Input)
  END
  RETURN CAST(@Input as INTEGER)
END

xp_cmdshell aktivieren

11.04.2010 posted by Frank Wenner

Vorgehensweise von Aktivieren der SQL Server Prozedure xp_cmdshell
-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO