SQL Server эквивалентен Oracle CREATE OR REPLACE VIEW - PullRequest
108 голосов
/ 02 октября 2008

В Oracle я могу заново создать представление с помощью одного оператора, как показано здесь:

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

Как следует из синтаксиса, это отбросит старое представление и заново создаст его с любым определением, которое я дал.

Есть ли в MSSQL эквивалент (SQL Server 2005 или более поздняя версия), который будет делать то же самое?

Ответы [ 9 ]

99 голосов
/ 03 марта 2011

Приведенные выше решения, хотя они и будут выполнять свою работу, делают это с риском потери пользовательских прав. Я предпочитаю создавать или заменять представления или хранимые процедуры следующим образом.

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
44 голосов
/ 02 октября 2008

Вы можете использовать «ЕСЛИ СУЩЕСТВУЕТ», чтобы проверить, существует ли представление, и отбросить, если оно существует.

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

CREATE VIEW MyView
AS 
     ....
GO
26 голосов
/ 20 ноября 2016

Для справки из SQL Server 2016 SP1+ вы можете использовать синтаксис 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 ]   
[ ; ]

ИЛИ ALTER

Условно изменяет представление, только если оно уже существует.

db <> fiddle demo

13 голосов
/ 02 июня 2009

Я использую:

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

...

Недавно я добавил несколько служебных процедур для такого рода вещей:

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

Так что теперь я пишу

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

Я думаю, это делает мои изменения более читабельными

6 голосов
/ 02 октября 2008

Я обычно использую что-то вроде этого:

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 [...]
5 голосов
/ 30 октября 2015

Начиная с SQL Server 2016 у вас есть

DROP TABLE IF EXISTS [foo];

MSDN-источник

2 голосов
/ 20 ноября 2017

У меня отлично работает на 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-

2 голосов
/ 02 октября 2008

Вы можете использовать ALTER для обновления представления, но это отличается от команды Oracle, поскольку она работает, только если представление уже существует. Вероятно, лучше с ответом DaveK, так как это всегда будет работать.

1 голос
/ 13 февраля 2019

В SQL Server 2016 (или новее) вы можете использовать это:

CREATE OR REPLACE VIEW VW_NAMEOFVIEW AS ...

В старых версиях SQL-сервера вы должны использовать что-то вроде

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...