|
Transact SQL Script: Null_eliminator_final.SQL
questions? mailto:info@itrain.de
Download SQL Script
Dieses Script dient nur Demonstrationszwecken. Verwendung des Scripts erfolgt auf eigene Gefahr.
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'sp_MORE_THAN_n_NULL_VALUES' AND type='P') DROP PROCEDURE sp_MORE_THAN_n_NULL_VALUES GO CREATE PROCEDURE sp_MORE_THAN_n_NULL_VALUES -- Prozedur : sp_MORE_THAN_n_NULL_VALUES -- Autor : svenh@itrain.de -- Löscht bzw. selektiert alle Datensätze aus der Tabelle @tabelle, -- bei denen mehr als @maxNullCols einen Nullwert enthalten -- @modus = 'SELECT' SElektieren; @modus = 'DELETE' - Löschen @modus varchar(20) = 'SELECT', @tabelle sysname, @maxNullCols int = 10 AS SET CONCAT_NULL_YIELDS_NULL ON DECLARE @strSELECT varchar(8000) -- Prüfen, ob gültiger Modus angegeben wurde IF NOT @modus IN ('SELECT', 'DELETE') BEGIN RAISERROR ('Ungültiger Modus. Nur SELECT und DELETE erlaubt', 10, 1) RETURN -1 END ELSE BEGIN -- Prüfen, ob Tabelle existiert IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.Tables WHERE TABLE_NAME = @tabelle) BEGIN RAISERROR ('Tabelle nicht vorhanden. Prozedur abgebrochen.', 10,1) RETURN -1 END ELSE BEGIN -- Zusammensetzen der CASE-Bedingungen für jede Spalte SELECT @strSELECT = ISNULL(@strSELECT + ' + CASE WHEN ' + column_name + ' IS NULL THEN 1 ELSE 0 END', 'CASE WHEN ' + column_name + ' IS NULL THEN 1 ELSE 0 END') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tabelle ORDER BY ordinal_position SET @strSELECT = @strSELECT + ' > ' + CAST(@maxNullCols As varchar(3)) IF @modus = 'DELETE' SET @strSELECT = 'DELETE FROM ' + @tabelle + ' WHERE ' + @strselect ELSE SET @strSELECT = 'SELECT * FROM ' + @tabelle + ' WHERE ' + @strSELECT -- Ausführen der DELETE/SELECT-Anweisung EXEC (@strSELECT) -- Rückgabe der Anzahl der betroffenen Zeilen RETURN @@ROWCOUNT END END GO -- Testscript mit Beispieltabelle zum Testen der Prozedur IF OBJECT_ID('TESTNULLVAL', 'U') IS NOT NULL DROP TABLE TESTNULLVAL GO CREATE TABLE TESTNULLVAL(spalte1 int NULL, spalte2 int NULL, spalte3 int NULL, spalte4 int NULL) GO INSERT INTO TESTNULLVAL SELECT 1, 2, 3, 4 UNION SELECT 1, 2, 3, NULL UNION SELECT 1, 2, NULL, NULL UNION SELECT 1, NULL, 3, NULL UNION SELECT 1, NULL, NULL, NULL GO SELECT * FROM TESTNULLVAL EXEC sp_MORE_THAN_n_NULL_VALUES 'SELECT', 'TESTNULLVAL', 1 EXEC sp_MORE_THAN_n_NULL_VALUES 'SELECT', 'TESTNULLVAL', 2 -- oder EXEC sp_MORE_THAN_n_NULL_VALUES 'DELETE', 'TESTNULLVAL', 2 SELECT * FROM TESTNULLVAL
|