Announcement

Collapse
No announcement yet.

View löschen wenn Tabelle nicht vorhanden ist

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • View löschen wenn Tabelle nicht vorhanden ist

    Hallo zusammen,
    ich habe eine SQL-Server 2000 DB in es eine ganze Reihe Views, die eine 1:1 Abbildung einer Tabelle mit fast dem selben Namen ist (Tabelle='TP_' , View='VP_') .
    Über die Jahre hinweg wurden immer wieder Tabellen hinzugefügt (inkl. View) und auch Tabellen entfernt. Beim entfernen wurden aber die Views nie mit entfernt.
    Ich möchte jetzt ein Skript über die DB laufen lassen, das alle Views löscht, zu denen die entsprechende Tabelle fehlt.

    [highlight=SQL-Server]
    declare @STCursor cursor
    declare @sicht varchar(50)
    declare @anzahl int

    set @STCursor = CURSOR LOCAL FOR SELECT [TPName] FROM [dbo].[TP_Tabellen]
    OPEN @STCursor

    FETCH NEXT FROM @STCursor INTO @sicht

    WHILE @@FETCH_STATUS = 0
    BEGIN
    Select @anzahl=count(*) from sysobjects where xtype='U' and [name] = REPLACE(@sicht,'VP_','TP_')
    if (@anzahl = 0)
    BEGIN
    DROP VIEW [@sicht]
    END
    FETCH NEXT FROM @STCursor INTO @sicht
    END
    CLOSE @STCursor
    DEALLOCATE @STCursor
    [/highlight]

    sieht nett aus, funktioniert aber leider nicht.
    Sieht jemand, was ich falsch mache?
    Zuletzt editiert von Andreas Mahr; 17.04.2009, 15:28.

  • #2
    Originally posted by Andreas Mahr View Post
    Hallo zusammen,
    ich habe eine SQL-Server 2000 DB in es eine ganze Reihe Views, die eine 1:1 Abbildung einer Tabelle mit fast dem selben Namen ist (Tabelle='TP_' , View='VP_') .
    Über die Jahre hinweg wurden immer wieder Tabellen hinzugefügt (inkl. View) und auch Tabellen entfernt. Beim entfernen wurden aber die Views nie mit entfernt.
    Ich möchte jetzt ein Skript über die DB laufen lassen, das alle Views löscht, zu denen die entsprechende Tabelle fehlt.

    [highlight=SQL-Server]
    declare @STCursor cursor
    declare @sicht varchar(50)
    declare @anzahl int

    set @STCursor = CURSOR LOCAL FOR SELECT [TPName] FROM [dbo].[TP_Tabellen]
    OPEN @STCursor

    FETCH NEXT FROM @STCursor INTO @sicht

    WHILE @@FETCH_STATUS = 0
    BEGIN
    Select @anzahl=count(*) from sysobjects where xtype='U' and [name] = REPLACE(@sicht,'VP_','TP_')
    if (@anzahl = 0)
    BEGIN
    DROP VIEW [@sicht]
    END
    FETCH NEXT FROM @STCursor INTO @sicht
    END
    CLOSE @STCursor
    DEALLOCATE @STCursor
    [/highlight]

    sieht nett aus, funktioniert aber leider nicht.
    Sieht jemand, was ich falsch mache?
    Dynamic SQL:

    [HIGHLIGHT="SQL"]declare @STCursor cursor
    declare @sicht varchar(50)
    declare @anzahl int
    DECLARE @Stmt VARCHAR(1000)
    set @STCursor = CURSOR LOCAL FOR SELECT [TPName] FROM [dbo].[TP_Tabellen]
    OPEN @STCursor

    FETCH NEXT FROM @STCursor INTO @sicht

    WHILE @@FETCH_STATUS = 0
    BEGIN
    Select @anzahl=count(*) from sysobjects where xtype='U' and [name] = REPLACE(@sicht,'VP_','TP_')
    if (@anzahl = 0)
    BEGIN
    SET @Stmt = 'DROP VIEW ' +@sicht;
    EXEC (@Stmt);
    END
    FETCH NEXT FROM @STCursor INTO @sicht
    END
    CLOSE @STCursor
    DEALLOCATE @STCursor[/HIGHLIGHT]

    Comment


    • #3
      ah...super, danke
      jetzt funktioniert es

      Comment

      Working...
      X