Posts mit dem Label T-SQL werden angezeigt. Alle Posts anzeigen
Posts mit dem Label T-SQL werden angezeigt. Alle Posts anzeigen

Mittwoch, 6. Juli 2011

Hinzufügen einer NOT-NULL-Spalte zu einer bestehenden, gefüllten Tabelle

Was tun, wenn eine neue Spalte zu einer Tabelle hinzugefügt werden soll, diese neue Spalte keine NULL-Werte enthalten darf, doch die Tabelle bereits Datensätze enthält? Eine schlichte "ALTER TABLE"-Anweisung lässt der MS SQL Server nicht zu.

Die Lösung ist schlicht, aber wie mir im I-Net auffiel nicht für jeden gleich offensichtlich.

Bei mir eine aktuelle Aufgabe: Gegeben ist eine Tabelle "Hersteller", welche schon Datensätze enthält. Hinzugefügt werden soll eine Spalte mit dem Namen "AutoAnlegen" vom Datentyp "bit", welche keine NULL-Werte enthalten darf und als Standard auf "false" steht. Die Umsetzung erfolgt in drei Schritten:

  1.  ALTER TABLE Hersteller
  2.     ADD AutoAnlegen bit DEFAULT 0
  1.  Update Hersteller SET AutoAnlegen = 0
  1.  Alter Table Hersteller
  2.     Alter Column AutoAnlegen bit Not NULL

Samstag, 11. Juni 2011

Ordnen der Datenbank-Sortierung nach Art des Hauses via Stored Procedure

Hinweis:
Dieser Beitrag macht nur für mich Sinn; nicht wundern.

Diese Stored Procedure ist ein Muster für die Neuordnung der "Sortierung"-Spalte nach einer Umsortierung. Die Namen des Schemas, der Tabelle und der Sortierungsspalte sind fix, da dynamisches SQL lt. diverser Autoren Performanceeinbußen bringt.
Da hingegen das Datenbankdesign bezüglich der Sortierung unveränderlich ist, sollte pro Tabelle eine Stored Procedure keine unüberwindliche Hürde darstellen.

Das "Create"-Statement

  1. SET ANSI_NULLS ON
  2. GO
  3. SET QUOTED_IDENTIFIER ON
  4. GO
  5.  
  6. -- =============================================
  7. -- Author: Hermann J. Leopold
  8. -- Create date: 09.6.2011
  9. -- Description: Glättet die Sortierungsspalte
  10. -- =============================================
  11. CREATE PROCEDURE [dbo].[spGlaetteSortierung]
  12. AS
  13. BEGIN
  14. -- SET NOCOUNT ON added to prevent extra result sets from
  15. -- interfering with SELECT statements.
  16. SET NOCOUNT ON;
  17.  
  18.      -- temporäre Tabelle
  19. DECLARE @Vorsortiert AS TABLE(ID bigint, Sortierung int)
  20. -- Daten in die temporäre Tabelle schreiben
  21. SELECT [ID], ROW_NUMBER() OVER (ORDER BY [Sortierung]) AS Sortierung
  22. INTO #Vorsortiert FROM [test1].[dbo].[Sortiertest]
  23. ORDER BY [Sortierung]
  24. -- Tabelle 'Sortiertest' aktualisieren
  25. UPDATE [test1].[dbo].Sortiertest
  26. SET [Sortiertest].[Sortierung] = #Vorsortiert.Sortierung * 2
  27. FROM #Vorsortiert
  28. INNER JOIN [Sortiertest] ON #Vorsortiert.ID = [Sortiertest].[ID]
  29. END
  30. GO
  31.  

Hinweis

Diese Stored Procedure ist nur ein Muster; es fehlt insbesondere jegliche Form von Fehlerbehandlung.

Die Tabelle zum obigen Beispiel

  1. USE [test1]
  2. GO
  3.  
  4. /****** Object: Table [dbo].[Sortiertest] Script Date: 06/11/2011 10:48:34 ******/
  5. SET ANSI_NULLS ON
  6. GO
  7.  
  8. SET QUOTED_IDENTIFIER ON
  9. GO
  10.  
  11. CREATE TABLE [dbo].[Sortiertest](
  12. [ID] [bigint] IDENTITY( 1, 1) NOT NULL,
  13. [Muster] [nchar]( 10) NULL,
  14. [Sortierung] [int] NOT NULL,
  15.   CONSTRAINT [PK_Sortiertest] PRIMARY KEY CLUSTERED
  16. (
  17. [ID] ASC
  18. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  19. ) ON [PRIMARY]
  20.  
  21. GO
  22.  

Speicherort

SQL-Scripte; Asus

SQLQuery3.sql