SQL Server, еквівалентний ПРОСМОТУ СТВОРИТИ АБО ЗАМІНИ Oracle


115

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

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

Як випливає з синтаксису, це видалить старий вигляд і знову створить його з будь-яким визначенням, яке я дав.

Чи є еквівалент у MSSQL (SQL Server 2005 або новішої версії), який буде робити те саме?

Відповіді:


103

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

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

2
Я раніше був "Краплею" тоді (пере) "Додати" людиною. Але тепер я схиляюся до такого типу рішення (додайте, якщо його немає, то змініть).
granadaCoder

Змінити вигляд - це набагато краще, ніж скинути і відтворити його. Що робити, якщо у вас є багато налаштувань безпеки користувачів для перегляду, тоді вам доведеться відтворити всі ці. Це мій підхід до цього питання.
jonas

Твоя СТВОРЕННЯ та АЛЬТЕР роблять різні речі .... чому? (Один динамічний, інший - ні. У них різні повідомлення.)
Джей Салліван,

Я вважаю це заплутаним, як ваше твердження CREATE VIEW включає "замінене заявою Alter" - що це означає? Також мені незрозуміло, який код насправді слід замінити тут, або як. Я, мабуть, один із небагатьох, хто бентежить у вашій відповіді.
Kyle Julé

2
Для SQL Server 2016 SP1 + див. Відповідь на lad2025.
MBWise

45

Ви можете скористатись "IF EXISTS", щоб перевірити, чи існує перегляд, і випаде, якщо він є.

ЯКЩО Є ВИБІР (ВИБІРТЕ ТАБЛИЦЯ З ІНФОРМАЦІЇ_SCHEMA.VIEWS
        ДЕ TABLE_NAME = "Мій погляд")
    ПЕРЕГЛЯД СЛУЖБИ MyView
ПОВЕРНУТИ

СТВОРИТИ ПОГЛЯД MyView
ЯК 
     ….
ПОВЕРНУТИ

13
Проблема в цьому полягає в тому, що ви втрачаєте будь-які дозволи, які могли існувати на об'єкт, який випали.
simon

37

Для довідки SQL Server 2016 SP1+ви можете використовувати CREATE OR ALTER VIEWсинтаксис.

ОГЛЯД СТВОРЕННЯ MSDN :

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

АБО АЛЬТЕР

Умовно змінюється погляд лише в тому випадку, якщо він вже існує.

db <> скриптова демонстрація


Це синтаксис. Ви не можете використовувати одночасно ключові слова CREATE AND ALTER, як і в ORACLE. ви отримаєте нижче помилок, якщо спробуєте подібне. - Неправильний синтаксис біля ключового слова "АБО". - "CREATE / ALTER PROCEDURE" повинен бути першим твердженням у групі запитів.
Div Tiwari

3
@DivTiwari, мабуть, це дійсно в SQL 2016. Потрібно було лише SQL Server 11 років, щоб наздогнати цю функцію оракул, мабуть :)
JosephStyons

1
@JosephStyons Дійсно, ти маєш рацію! Я не розумію, як вони так довго пропускали таку важливу особливість.
Div Tiwari

@DivTiwari Це був вибір розробників: СТВОРИТИ АЛЬБО Краще пізно, ніж ніколи :)
Lukasz Szozda

14

Я використовую:

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

Я думаю, що це робить мої сценарії змін трохи читабельнішими


7

Зазвичай я використовую щось подібне:

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



2

Ви можете використовувати ALTER для оновлення подання, але це відрізняється від команди Oracle, оскільки вона працює лише тоді, коли представлення вже існує. Напевно, краще з відповіддю DaveK, оскільки це завжди спрацює.


1
Хоча ALTER зберігає існуючі дозволи (і зберігає стару версію, якщо нова версія має синтаксичні помилки тощо). Тож використання IF NOT EXISTS ... для створення Stub, а потім ALTER для його заміни / оригіналу може бути кращим у підтримці дозволів та залежностей.
Крістен

1

У SQL Server 2016 (або новіших версіях) ви можете використовувати це:

CREATE OR ALTER 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

Або, якщо немає залежностей від перегляду, ви можете просто скинути його і відтворити:

IF EXISTS(SELECT * FROM sys.views WHERE name = 'VW_NAMEOFVIEW')
-- IF OBJECT_ID('[dbo].[VW_NAMEOFVIEW]') IS NOT NULL
BEGIN 
   DROP VIEW [VW_NAMEOFVIEW];
END

CREATE VIEW [VW_NAMEOFVIEW] AS ...

1
Я використовую SQL Server 2016 (або новіший) і не можу використовувати CREATE OR REPLACE VIEWсинтаксис. Правильний синтаксис є CREATE OR ALTER VIEW. Як виходить, що everybdody заявляє, що це є CREATE OR REPLACEв будь-якій іншій точці SO, яку я знаходжу 🤔
WoIIe

@Wolle, СТВОРИТИ АБО ЗАМІНУ - це синтаксис в Oracle (див. Запитання)
Євген Лиценок
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.