none
Addcolumn macht *-View kaputt RRS feed

  • Frage

  • Hallo,

    Wenn ich einer Tabelle eine Spalte hinzufügen, dann gehen alle abhängigen Views kaputt, die die Tabelle mit einem Wildcard (*) verwenden.

    Ist dieses Verhalten beabsichtigt?

    Beispiel:

    select 1 as a,2 as b ,3 as c into tblTest go create VIEW ViewTest1 AS SELECT tblTest.*, 1 as testv1, 2 as testv2 FROM tblTest go create VIEW ViewTest2 AS SELECT tblTest.*, 1 as testv1, 2 as testv2 FROM tblTest go ALTER TABLE tblTest ADD test12 int null EXECUTE sp_refreshview 'ViewTest1' -- ViewTest2 is broken now. (all columns moved 1 place to the right.) select testv1, testv2 from ViewTest1
    select testv1, testv2 from ViewTest2 drop view ViewTest1 drop view ViewTest2 drop table tblTest

    Ergebnis:

    testv1      testv2
    ----------- -----------
    1           2
    
    testv1      testv2
    ----------- -----------
    NULL        1

    Weitere Beobachtung:

    Wenn das Wildcard am Ende steht, dann geht die View nicht kaputt. Das SP sp_refreshview repariert die View wieder.  Das Phänomen tritt mit SQLServer 2014 und mit SQLServer 2012 auf.


    • Bearbeitet BjörnJürgens Donnerstag, 15. Oktober 2015 13:24 Ausgabe des Skriptes nachgetragen.
    Donnerstag, 15. Oktober 2015 12:51

Antworten

  • Hallo Björn,

    ja das ist beabsichtigt. Denn das "*" ist für sich schon "kaputt".

    De facto gibt es in einer Sicht kein "*", sondern es werden alle Spalten zum Zeitpunkt der Erstellung in die Metadaten der Sicht übernommen. Kommen spätere neue Spalten hinzu, werden welche entfernt oder aber auch nur die Reihenfolge verändert bekommt die Sicht nichts davon mit.

    Deswegen kann man von der Verwendung von "*" in Sichten (und Abfragen i. a.) nur abraten. Gib die Spalten explizit an, die in der Sicht angezeigt werden sollen.

    Gruß Elmar

    Donnerstag, 15. Oktober 2015 12:56
    Beantworter
  • Hi,

    * wird, wie Elmar schon gesagt hat, zum Erstellungszeitpunkt der View aufgelöst. Fügst Du jetzt bspw. eine Spalte X irgendwo mitten in eine der abgefragten Tabellen ein, verschieben sich alle Referenzen ab dieser Spalte, die letzte Spalte wird dann fehlen. Dasselbe gilt für Neuordnung von Spalten, ... In dem Fall werden dann auch Werte vertauscht, in Spalte "Umsatz" steht dann bspw. auf einmal der Wert aus "Anzahl" oder in "Geburtsdatum" der Wert aus "Telefon", ...

    Daher: Kein * verwenden und alle Spaltennamen sauber angeben. Dann hast Du dieses Problem nicht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 15. Oktober 2015 15:07
    Moderator

Alle Antworten

  • Hallo Björn,

    ja das ist beabsichtigt. Denn das "*" ist für sich schon "kaputt".

    De facto gibt es in einer Sicht kein "*", sondern es werden alle Spalten zum Zeitpunkt der Erstellung in die Metadaten der Sicht übernommen. Kommen spätere neue Spalten hinzu, werden welche entfernt oder aber auch nur die Reihenfolge verändert bekommt die Sicht nichts davon mit.

    Deswegen kann man von der Verwendung von "*" in Sichten (und Abfragen i. a.) nur abraten. Gib die Spalten explizit an, die in der Sicht angezeigt werden sollen.

    Gruß Elmar

    Donnerstag, 15. Oktober 2015 12:56
    Beantworter
  • Deswegen kann man von der Verwendung von "*" in Sichten (und Abfragen i. a.) nur abraten. Gib die Spalten explizit an, die in der Sicht angezeigt werden sollen.

    Hallo Elmar,

    Ich stimme dir zu: Die Lösung scheint darin zu bestehen, kein * zu verwenden.

    Mit "kaputt" meine ich: "die Linke Spalte in der View wird null und die rechte Spalte enthält den Wert der Linken Spalte. "

    Das Skript im ersten Post liefert folgendes Ergebnis:

    testv1      testv2
    ----------- -----------
    1           2
    
    
    testv1      testv2
    ----------- -----------
    NULL        1
    

    Wo kommt hier das "null" her?



    • Bearbeitet BjörnJürgens Donnerstag, 15. Oktober 2015 13:06 Screenshot wurde durch text ersetzt
    Donnerstag, 15. Oktober 2015 13:04
  • Hi,

    * wird, wie Elmar schon gesagt hat, zum Erstellungszeitpunkt der View aufgelöst. Fügst Du jetzt bspw. eine Spalte X irgendwo mitten in eine der abgefragten Tabellen ein, verschieben sich alle Referenzen ab dieser Spalte, die letzte Spalte wird dann fehlen. Dasselbe gilt für Neuordnung von Spalten, ... In dem Fall werden dann auch Werte vertauscht, in Spalte "Umsatz" steht dann bspw. auf einmal der Wert aus "Anzahl" oder in "Geburtsdatum" der Wert aus "Telefon", ...

    Daher: Kein * verwenden und alle Spaltennamen sauber angeben. Dann hast Du dieses Problem nicht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 15. Oktober 2015 15:07
    Moderator