webentwicklung-frage-antwort-db.com.de

Drop-Ansicht, falls vorhanden

Ich habe ein Skript, wo ich zuerst die Ansicht löschen und dann erstellen möchte . Ich weiß, wie die Tabelle gelöscht wird:

IF EXISTS (SELECT * FROM sys.tables WHERE name = 'table1' AND type = 'U') DROP TABLE table1;

also tat ich dasselbe für ansichten:

IF EXISTS (SELECT * FROM sys.views WHERE name = 'view1' AND type = 'U') DROP VIEW view1;
create view1 as(......)

und dann bekam ich Fehler:

'CREATE VIEW' muss die erste Anweisung in einem Abfragebatch sein.

22
4est

ihre bestehende Syntax ist falsch und Sie sollten DDL mit go wie unten trennen

if exists(select 1 from sys.views where name='tst' and type='v')
drop view tst;
go

create view tst
as
select * from test

sie können auch den Existenz-Test mit object_id wie unten prüfen

if object_id('tst','v') is not null
drop view tst;
go

create view tst
as
select * from test

In SQL 2016 können Sie zum Ablegen die folgende Syntax verwenden 

Drop view  if exists dbo.tst

In SQL2016 CU1 können Sie das unten tun

create or alter view vwTest
as
 select 1 as col;
go
64
TheGameiswar
DROP VIEW if exists {ViewName}
Go
CREATE View {ViewName} AS 
SELECT * from {TableName}  
Go
1
Anwar Ul Haq

Bezüglich des Fehlers 

'CREATE VIEW' must be the first statement in a query batch.

Microsoft SQL Server hat eine etwas eigenartige Anforderung, dass CREATE VIEW die only -Anweisung in einem Stapel sein muss. Dies gilt auch für einige andere Anweisungen, z. B. CREATE FUNCTION. Es ist nicht wahr von CREATE TABLE.

Die Lösung ist, Ihr Skript in kleinen Batches an den Server zu senden. Eine Möglichkeit, dies auszuführen, besteht darin, eine einzelne Anweisung auszuwählen und auszuführen. Dies ist eindeutig unpraktisch.

Die bequemere Lösung besteht darin, den Client dazu zu bringen, das Skript in kleinen isolierten Stapeln zu senden.

Das GO-Schlüsselwort ist kein strikter SQL-Befehl. Aus diesem Grund können Sie es nicht mit einem Semikolon wie echte SQL-Befehle beenden. Stattdessen ist es eine Anweisung an den Client, das Skript an dieser Stelle zu brechen und den Teil als Stapel zu senden.

Als Ergebnis schreiben Sie so etwas wie:

DROP VIEW IF EXISTS … ;
GO
CREATE VIEW … AS … ;
GO

Keiner der anderen Datenbankserver, auf die ich gestoßen bin (PostgreSQL, MySQL, Oracle, SQLite), haben diese Eigenart, daher scheint die Anforderung nur Microsoft zu sein.

0
Manngo

Um auch für das Schema zu sorgen, verwenden Sie dieses Format in SQL 2014

if exists(select 1 from sys.views V inner join sys.[schemas] S on  v.schema_id = s.schema_id where s.name='dbo' and v.name = 'someviewname' and v.type = 'v')
  drop view [dbo].[someviewname];
go

Und wir werfen es einfach raus, um gespeicherte Prozeduren auszuführen, weil ich das auch brauchte:

if exists(select 1
          from sys.procedures p
          inner join sys.[schemas] S on p.schema_id = s.schema_id
          where
              s.name='dbo' and p.name = 'someprocname'
          and p.type in ('p', 'pc')
  drop procedure [dbo].[someprocname];
go
0
user230910