it-swarm.com.de

SQL Server äquivalent zu Oracle CREATE OR REPLACE VIEW

In Oracle kann ich eine Ansicht mit einer einzelnen Anweisung neu erstellen, wie hier gezeigt:

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

Wie die Syntax impliziert, wird die alte Ansicht gelöscht und mit der von mir angegebenen Definition neu erstellt.

Gibt es eine Entsprechung in MSSQL (SQL Server 2005 oder höher), die dasselbe tut?

112
JosephStyons

Die oben genannten Lösungen erledigen den Job jedoch auf die Gefahr hin, dass Benutzerrechte verworfen werden. Ich bevorzuge es, Ansichten oder gespeicherte Prozeduren wie folgt zu erstellen oder zu ersetzen.

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
102
John DaCosta

Sie können 'WENN EXISTEN' verwenden, um zu überprüfen, ob die Ansicht vorhanden ist, und löschen, wenn dies der Fall ist.

 WENN EXISTIERT (TABELLENNAME AUS INFORMATIONSSCHEMA-ANSICHTEN AUSWÄHLEN 
 WO TABELLENNAME = 'MyView') 
 DROP VIEW MyView 
 GO 
 
 ANSICHT ERSTELLEN MyView 
 ALS 
 .... 
 GO 
45
DaveK

Als Referenz von SQL Server 2016 SP1+ Sie könnten CREATE OR ALTER VIEW Syntax.

MSDN CREATE VIEW :

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

ODER ALTER

Ändert die Ansicht nur bedingt, wenn sie bereits vorhanden ist.

db <> fiddle demo

29
Lukasz Szozda

Ich benutze:

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

...

Kürzlich habe ich einige Utility-Prozeduren für diese Art von Sachen hinzugefügt:

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

Also schreibe ich jetzt

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

Ich denke, das macht meine Änderungsskripte ein bisschen lesbarer

14
Tom

Ich benutze normalerweise so etwas:

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 [...]
7

Ab SQL Server 2016 haben Sie

DROP TABLE IF EXISTS [foo];

MSDN-Quelle

5
Justin Dearing

Es funktioniert gut für mich auf SQL Server 2017:

USE MSSQLTipsDemo 
GO
CREATE OR ALTER PROC CreateOrAlterDemo
AS
BEGIN
SELECT TOP 10 * FROM [dbo].[CountryInfoNew]
END
GO

https://www.mssqltips.com/sqlservertip/4640/new-create-or-alter-statement-in-

3
Lex

Sie können eine Ansicht mit ALTER aktualisieren, dies unterscheidet sich jedoch vom Oracle-Befehl, da es nur funktioniert, wenn die Ansicht bereits vorhanden ist. Wahrscheinlich besser dran mit DaveKs Antwort, da das immer funktionieren wird.

2
Bryant

In SQL Server 2016 (oder neuer) können Sie Folgendes verwenden:

CREATE OR REPLACE VIEW VW_NAMEOFVIEW AS ...

In älteren Versionen von SQL Server müssen Sie so etwas wie verwenden

DECLARE @script NVARCHAR(MAX) = N'VIEW [dbo].[VW_NAMEOFVIEW] AS ...';

IF NOT EXISTS(SELECT * FROM sys.views WHERE name = 'VW_NAMEOFVIEW')
-- IF OBJECT_ID('[dbo].[VW_NAMEOFVIEW]') IS NOT NULL
BEGIN EXEC('CREATE ' + @script) END
ELSE
BEGIN EXEC('ALTER ' + @script) END
1
MovGP0