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.