Benutzer mit den meisten Antworten
Addcolumn macht *-View kaputt

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 tblTestErgebnis:
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.
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
- Als Antwort markiert BjörnJürgens Freitag, 16. Oktober 2015 06:59
-
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- Als Antwort markiert BjörnJürgens Freitag, 16. Oktober 2015 06:59
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
- Als Antwort markiert BjörnJürgens Freitag, 16. Oktober 2015 06:59
-
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
-
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- Als Antwort markiert BjörnJürgens Freitag, 16. Oktober 2015 06:59