Forums Neueste Beiträge
 

Feld-Änderungen in Tabelle fehlen in Abfrage

25/02/2009 - 09:14 von Lutz Uhlmann | Report spam
Hallo NG!

Habe einen seltsamen Effekt beim SQL-Server 2005.

Wenn ich im Management-Studio zB die Feldgröße eines Feldes in einer Tabelle
àndere wird diese ohne Probleme übernommen. In einer Abfrage die auf dieser
Tabelle beruht steht aber immer noch die alte Feldgröße. Erst wenn ich die
Abfrage mit Bearbeiten öffne und das ALTER VIEW Skript nochmal ausführe,
kennt die Abfrage die neuen Feldgrößen.

Warum ist das so? Ist das ein Fehler oder gewollt? Ich finde es ziemlich
unlogisch und unpraktisch, da das ja bedeutet, daß ich bei solchen
Änderungen immer alle davon abhàngigen Abfragen nochmal anfassen muß!

Lutz
 

Lesen sie die antworten

#1 Christa Kurschat
25/02/2009 - 09:31 | Warnen spam
Hallo Lutz,

"Lutz Uhlmann" schrieb im Newsbeitrag
news:
Hallo NG!

Habe einen seltsamen Effekt beim SQL-Server 2005.

Wenn ich im Management-Studio zB die Feldgröße eines Feldes in einer
Tabelle
àndere wird diese ohne Probleme übernommen. In einer Abfrage die auf
dieser
Tabelle beruht steht aber immer noch die alte Feldgröße. Erst wenn ich die
Abfrage mit Bearbeiten öffne und das ALTER VIEW Skript nochmal ausführe,
kennt die Abfrage die neuen Feldgrößen.

Warum ist das so? Ist das ein Fehler oder gewollt? Ich finde es ziemlich
unlogisch und unpraktisch, da das ja bedeutet, daß ich bei solchen
Änderungen immer alle davon abhàngigen Abfragen nochmal anfassen muß!



Das ist so, weil die Metadaten abhàngiger Objekte nicht on the Fly
mitgeàndert werden. So bekommt ein view, der mit "select *" definiert ist,
auch nicht etwaige Strukturànderungen der darunterliegenden Tabelle mit.

Es gibt eine Proc sp_refreshview, mir der man die Strukturànderungen
übernehmen kann.
Elmar hat mal eine Proc gepostet, mit der man da sfür alle! views auführen
kann.
Sein Einverstàndnis vorausgesetzt, stelle ich die hier mal ein:
ALTER PROCEDURE [dbo].[spRefreshAllViews]
(
@TableName nvarchar(128) = NULL,
@OwnerName nvarchar(128) = NULL
)
AS
/*
Aktualisiert alle von einer Tabelle abhàngigen Sichten
der aktuellen Datenbank via sp_refreshview
*/
DECLARE
@cViewName nvarchar(128),
@cOwnerName nvarchar(128),
@fullname nvarchar(256),
@msg nvarchar(255)
SET NOCOUNT ON
IF @TableName IS NULL
SELECT @TableName = '%'
IF @OwnerName IS NULL
SELECT @OwnerName = USER_NAME()
DECLARE curViews CURSOR FOR
SELECT DISTINCT VIEW_SCHEMA, VIEW_NAME
FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE TABLE_SCHEMA LIKE @OwnerName AND TABLE_NAME LIKE @TableName
OPEN curViews
FETCH NEXT FROM curViews INTO @cOwnerName, @cViewName
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
SELECT @fullname = quotename(@cOwnerName) + '.' +
quotename(@cViewName)
PRINT @fullname
EXEC ('sp_refreshview ' + '''' + @fullname + '''')
END
FETCH NEXT FROM curViews INTO @cOwnerName, @cViewName
END
CLOSE curViews
DEALLOCATE curViews
RETURN 0


Gruß
Christa
Access-FAQ: http://www.donkarl.com
SQL-Server-FAQ: www.sqlfaq.de
InsideSql: www.insidesql.org

Ähnliche fragen