2008-10-02 8 views
94

Dans Oracle, je peux recréer une vue avec une seule instruction, comme indiqué ici:Sql Server équivalent à CREATE OR REPLACE Oracle estime

CREATE OR REPLACE VIEW MY_VIEW AS 
SELECT SOME_FIELD 
FROM SOME_TABLE 
WHERE SOME_CONDITIONS 

Comme la syntaxe implique, cela diminuera l'ancienne vue et recréer avec toute la définition que j'ai donnée.

Existe-t-il un équivalent dans SQL Server 2005 qui fera la même chose?

Répondre

90

Les solutions ci-dessus bien qu'elles feront le travail le font au risque de laisser tomber les permissions des utilisateurs. Je préfère créer ou remplacer des vues ou des procédures stockées comme suit.

IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[vw_myView]')) 
    EXEC sp_executesql N'CREATE VIEW [dbo].[vw_myView] AS SELECT ''This is a code stub which will be replaced by an Alter Statement'' as [code_stub]' 
GO 

ALTER VIEW [dbo].[vw_myView] 
AS 
SELECT 'This is a code which should be replaced by the real code for your view' as [real_code] 
GO 
+2

Avant j'étais "Drop" puis (ré) "Add" personne. Mais maintenant je me penche sur ce type de solution (ajouter sinon là, puis modifier). – granadaCoder

+0

Modifier une vue est bien mieux que de la laisser tomber et de la recréer. Que se passe-t-il si vous avez beaucoup de configuration de sécurité des utilisateurs existants pour une vue, alors vous devrez recréer tous ceux. C'est mon approche de ce problème. – jonas

+0

Votre CREATE et ALTER font des choses différentes ... pourquoi? (L'un est dynamique, l'autre ne l'est pas, et ils ont des messages différents.) –

43

Vous pouvez utiliser 'IF EXISTS' pour vérifier si la vue existe et abandonner si c'est le cas.

 
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS 
     WHERE TABLE_NAME = 'MyView') 
    DROP VIEW MyView 
GO 

CREATE VIEW MyView 
AS 
    .... 
GO 
+10

Le problème est que vous perdez toutes les autorisations qui ont pu exister sur l'objet qui a déposés. – simon

6

J'utilise généralement quelque chose comme ceci:

if exists (select * from dbo.sysobjects 
    where id = object_id(N'dbo.MyView') and 
    OBJECTPROPERTY(id, N'IsView') = 1) 
drop view dbo.MyView 
go 
create view dbo.MyView [...] 
+0

Cela fonctionne également avec les procédures stockées, les tables, etc. – Dave

2

Vous pouvez utiliser ALTER mettre à jour une vue, mais cela est différent de la commande Oracle, car il ne fonctionne que si la vue existe déjà. Probablement mieux avec la réponse de DaveK puisque cela fonctionnera toujours.

+1

Bien que ALTER conserve les autorisations existantes (et conserve l'ancienne version si la nouvelle version comporte des erreurs de syntaxe, etc.). Donc, en utilisant IF NOT EXISTS ... pour créer un Stub, puis ALTER pour le remplacer/original peut être mieux dans le maintien des autorisations et des dépendances. – Kristen

12

J'utilise:

IF OBJECT_ID('[dbo].[myView]') IS NOT NULL 
DROP VIEW [dbo].[myView] 
GO 
CREATE VIEW [dbo].[myView] 
AS 

...

Récemment j'ai ajouté quelques procédures d'utilité pour ce genre de choses:

CREATE PROCEDURE dbo.DropView 
@ASchema VARCHAR(100), 
@AView VARCHAR(100) 
AS 
BEGIN 
    DECLARE @sql VARCHAR(1000); 
    IF OBJECT_ID('[' + @ASchema + '].[' + @AView + ']') IS NOT NULL 
    BEGIN 
    SET @sql = 'DROP VIEW ' + '[' + @ASchema + '].[' + @AView + '] '; 
    EXEC(@sql); 
    END 
END 

Aujourd'hui, j'écris

EXEC dbo.DropView 'mySchema', 'myView' 
GO 
CREATE View myView 
... 
GO 

Je pense qu'il fait mes changescripts un peu plus lisibles

4

À partir de SQL Server 2016 vous avez

DROP TABLE IF EXISTS [foo]; 

MSDN source

14

Pour référence de SQL Server 2016 SP1+ vous pouvez utiliser la syntaxe CREATE OR ALTER VIEW.

MSDN CREATE VIEW:

CREATE [ OR ALTER ] VIEW [ schema_name . ] view_name [ (column [ ,...n ]) ] 
[ WITH <view_attribute> [ ,...n ] ] 
AS select_statement 
[ WITH CHECK OPTION ] 
[ ; ] 

OU MODIFIE

conditionnellement modifie la vue que si elle existe déjà.

+0

C'est une syntaxe. Vous ne pouvez pas utiliser à la fois les mots-clés CREATE AND ALTER comme vous le faites dans ORACLE. vous obtiendriez des erreurs ci-dessous si essayé comme ceci. - Syntaxe incorrecte près du mot clé 'OU'. - 'CREATE/ALTER PROCEDURE' doit être la première instruction d'un lot de requêtes. –

+1

@DivTiwari, ceci est apparemment valide dans SQL 2016. Il a fallu seulement 11 ans à SQL Server pour rattraper cette fonction d'oracle, apparemment :) – JosephStyons

+1

@JosephStyons En effet, vous avez raison! Je ne comprends pas comment ils ont manqué une fonctionnalité aussi importante depuis si longtemps. –

Questions connexes