web-dev-qa-db-fra.com

Drop view si existe

J'ai un script où je veux d'abord supprimer la vue, puis le créer

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

alors j'ai fait la même chose pour les vues:

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

et puis j'ai eu une erreur:

'CREATE VIEW' doit être la première instruction d'un lot de requêtes.

22
4est

votre syntaxe existe est fausse et vous devriez séparer DDL avec go comme ci-dessous

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

create view tst
as
select * from test

vous pouvez aussi vérifier le test d'existence, avec object_id comme ci-dessous

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

create view tst
as
select * from test

En SQL 2016, vous pouvez utiliser la syntaxe ci-dessous pour supprimer 

Drop view  if exists dbo.tst

De SQL2016 CU1, vous pouvez faire ci-dessous

create or alter view vwTest
as
 select 1 as col;
go
64
TheGameiswar

En ce qui concerne l'erreur 

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

Microsoft SQL Server a une exigence bizarre que CREATE VIEW soit l’instruction seulement dans un lot. Ceci est également vrai de quelques autres instructions, telles que CREATE FUNCTION. C'est pas vrai de CREATE TABLE, alors allez comprendre…

La solution consiste à envoyer votre script au serveur par petits lots. Une façon de faire est de sélectionner une seule instruction et de l'exécuter. Ceci est clairement gênant.

La solution la plus pratique consiste à faire en sorte que le client envoie le script par petits lots isolés.

Le mot clé GO n’est pas strictement une commande SQL. Par conséquent, vous ne pouvez pas le terminer par un point-virgule, comme de vraies commandes SQL. Au lieu de cela, le client est invité à interrompre le script à ce stade et à envoyer la partie sous forme de lot.

En conséquence, vous écrivez quelque chose comme:

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

Aucun des autres serveurs de base de données que j'ai rencontrés (PostgreSQL, MySQL, Oracle, SQLite) n'a cette bizarrerie, de sorte que l'exigence semble être Microsoft Only.

0
Manngo

Pour prendre également en charge le schéma, utilisez ce format dans 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

Et juste le jeter là-bas, pour faire des procédures stockées, parce que j'avais besoin de ça aussi:

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