Oracle'ın CREATE OR REPLACE VIEW ile eşdeğer SQL Server


115

Oracle'da, burada gösterildiği gibi tek bir ifadeyle bir görünümü yeniden oluşturabilirim:

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

Sözdiziminin ima ettiği gibi, bu eski görünümü bırakacak ve verdiğim tanım ne olursa olsun onu yeniden yaratacaktır.

MSSQL'de (SQL Server 2005 veya sonrası) aynı şeyi yapacak bir eşdeğeri var mı?

Yanıtlar:


103

Yukarıdaki çözümler, işi yapacak olsalar da, bunu kullanıcı izinlerini düşürme riski altında yaparlar. Görünümlerimi veya depolanan prosedürleri oluşturmayı veya değiştirmeyi aşağıdaki gibi yapmayı tercih ediyorum.

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
Eskiden "Bırak" ve sonra (yeniden) "Ekle" kişiydim. Ama şimdi bu tür bir çözüme dayanıyorum (orada değilse ekleyin, sonra değiştirin).
granadaCoder

Görünümü değiştirmek, düşürüp yeniden oluşturmaktan çok daha iyidir. Ya bir görünüm için çok sayıda mevcut kullanıcı güvenlik kurulumunuz varsa, hepsini yeniden oluşturmanız gerekir. Bu konuya yaklaşımım bu.
jonas

CREATE ve ALTER'iniz farklı şeyler yapıyor ... neden? (Biri dinamik, diğeri değil ve farklı mesajları var.)
Jay Sullivan 15

CREATE VIEW ifadenizin nasıl "bir Alter İfadesi ile değiştirildiğini" içerdiğini kafa karıştırıcı buluyorum - bu ne anlama geliyor? Ayrıca burada hangi kodun aslında nasıl değiştirileceği de net değil. Cevabınla kafası karışan birkaç kişiden biri olmalıyım.
Kyle Julé

2
SQL Server 2016 SP1 + için lad2025 yanıtına bakın.
MBWise

45

Görünümün var olup olmadığını kontrol etmek için 'IF VARSA' seçeneğini kullanabilir ve varsa bırakabilirsiniz.

VARSA (INFORMATION_SCHEMA.VIEWS'TEN TABLE_NAME SEÇİNİZ
        WHERE TABLE_NAME = 'MyView')
    DROP VIEW MyView
GİT

GÖRÜNÜM OLUŞTUR MyView
GİBİ 
     ....
GİT

13
Bununla ilgili sorun, bırakılan nesnede var olabilecek tüm izinleri kaybetmenizdir.
simon

37

SQL Server 2016 SP1+Sizden referans almak için CREATE OR ALTER VIEWsözdizimini kullanabilirsiniz .

MSDN CREATE GÖRÜNÜMÜ :

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

VEYA DEĞİŞTİR

Görünümü koşullu olarak, yalnızca zaten mevcutsa değiştirir.

db <> fiddle demosu


Bu bir sözdizimi. ORACLE'da yaptığınız gibi aynı anda hem CREATE AND ALTER anahtar kelimelerini kullanamazsınız. böyle denerse aşağıdaki hataları alırsınız. - 'VEYA' anahtar kelimesinin yanında yanlış sözdizimi. - 'CREATE / ALTER PROCEDURE', bir sorgu toplu işindeki ilk ifade olmalıdır.
Div Tiwari

3
@DivTiwari, bu görünüşe göre SQL 2016'da geçerli. Görünüşe göre bu oracle özelliğine yetişmek için SQL Server 11 yıl sürdü :)
JosephStyons

1
@JosephStyons Gerçekten, haklısınız! Bu kadar önemli bir özelliği bu kadar uzun süre nasıl kaçırdılar anlamıyorum.
Div Tiwari


14

Kullanırım:

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

...

Son zamanlarda bu tür şeyler için bazı yardımcı prosedürler ekledim:

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

Bu yüzden şimdi yazıyorum

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

Sanırım değişikliklerimi biraz daha okunaklı hale getiriyor


7

Genelde şöyle bir şey kullanırım:

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

Bir görünümü güncellemek için ALTER kullanabilirsiniz, ancak bu, yalnızca görünüm zaten mevcutsa çalıştığı için Oracle komutundan farklıdır. Muhtemelen DaveK'in cevabıyla daha iyi durumda çünkü bu her zaman işe yarayacaktır.


1
ALTER mevcut İzinleri saklasa da (ve yeni sürümde sözdizimi hataları varsa, Eski Sürümü koruyor). Dolayısıyla, bir Stub oluşturmak için IF NOT EXISTS ... ve ardından onu / orijinali değiştirmek için ALTER kullanmak izinleri ve bağımlılıkları sürdürmede daha iyi olabilir.
Kristen

1

SQL Server 2016'da (veya daha yenisi) şunu kullanabilirsiniz:

CREATE OR ALTER VIEW VW_NAMEOFVIEW AS ...

SQL sunucusunun eski sürümlerinde, aşağıdaki gibi bir şey kullanmanız gerekir

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

Veya görünümde herhangi bir bağımlılık yoksa, onu bırakıp yeniden oluşturabilirsiniz:

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 (veya daha yenisini) kullanıyorum ve CREATE OR REPLACE VIEWsözdizimini kullanamıyorum . Doğru sözdizimi CREATE OR ALTER VIEW. Nasıl oluyor da herkes bulduğum CREATE OR REPLACEdiğer her SO ileti dizisinde olduğunu söylüyor 🤔
WoIIe

@Wolle, CREATE OR DEĞİŞTİR, Oracle'daki sözdizimidir (soruya bakın)
Eugene Lycenok
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.