Подтвердить что ты не робот

При просмотре

У меня есть script, где я хочу сначала перенести представление, а затем создать его. Я знаю, как удалить стол:

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

поэтому я сделал то же самое для просмотров:

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

а затем я получил ошибку:

'CREATE VIEW' должен быть первым оператором в пакете запросов.

4b9b3361

Ответ 1

ваш синтаксис существует неправильно, и вы должны разделить DDL на go, как показано ниже

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

create view tst
as
select * from test

вы также можете проверить тест существования, с object_id, как показано ниже

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

create view tst
as
select * from test

В SQL 2016 вы можете использовать синтаксис ниже, чтобы сбросить

Drop view  if exists dbo.tst

Из SQL2016 CU1 вы можете сделать ниже

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

Ответ 2

Чтобы обслуживать и схему, используйте этот формат в 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

И просто добавлю это, чтобы делать хранимые процедуры, потому что мне это тоже нужно:

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

Ответ 3

По поводу ошибки

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

Microsoft SQL Server имеет причудливое требование, чтобы CREATE VIEW был единственным оператором в пакете. Это также верно для некоторых других операторов, таких как CREATE FUNCTION. Это не относится к CREATE TABLE, так что пойди разберись...

Решением является отправка вашего скрипта на сервер небольшими партиями. Один из способов сделать это - выбрать один оператор и выполнить его. Это явно неудобно.

Более удобное решение - заставить клиента отправлять скрипт небольшими изолированными партиями.

Ключевое слово GO не является строго командой SQL, поэтому нельзя завершить его точкой с запятой, как настоящие команды SQL. Вместо этого это инструкция для клиента разорвать сценарий на этом этапе и отправить часть в виде пакета.

В результате вы пишете что-то вроде:

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

Ни один из других серверов баз данных, с которыми я сталкивался (PostgreSQL, MySQL, Oracle, SQLite), не обладает этой причудой, поэтому требование, по-видимому, относится только к Microsoft.

Ответ 4

DROP VIEW if exists {ViewName}
Go
CREATE View {ViewName} AS 
SELECT * from {TableName}  
Go