SQL Server setara dengan tampilan CREATE OR REPLACE VIEW dari Oracle

115

Di Oracle, saya dapat membuat ulang tampilan dengan satu pernyataan, seperti yang ditunjukkan di sini:

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

Seperti yang tersirat dalam sintaks, ini akan menghilangkan tampilan lama dan membuatnya kembali dengan definisi apa pun yang telah saya berikan.

Apakah ada padanan di MSSQL (SQL Server 2005 atau yang lebih baru) yang akan melakukan hal yang sama?

JosephStyons
sumber

Jawaban:

103

Solusi di atas meskipun mereka akan menyelesaikan pekerjaan dengan risiko mencabut izin pengguna. Saya lebih suka melakukan membuat atau mengganti tampilan atau prosedur tersimpan sebagai berikut.

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
johndacostaa
sumber
2
Saya dulu adalah orang yang "Jatuhkan" lalu (kembali) "Tambah". Tapi sekarang saya bersandar pada jenis solusi ini (tambahkan jika tidak ada, lalu ubah).
granadaCoder
Mengubah tampilan jauh lebih baik daripada menjatuhkan dan membuatnya kembali. Bagaimana jika Anda memiliki banyak pengaturan keamanan pengguna yang ada untuk sebuah tampilan, maka Anda harus membuat ulang semua itu. Ini adalah pendekatan saya untuk masalah ini.
jonas
CREATE and ALTER Anda melakukan hal yang berbeda .... mengapa? (Yang satu dinamis, yang lain tidak, dan mereka memiliki pesan yang berbeda.)
Jay Sullivan
Saya merasa bingung bagaimana pernyataan CREATE VIEW Anda melibatkan "diganti dengan Pernyataan Alter" - apa artinya? Juga tidak jelas bagi saya kode apa yang sebenarnya harus diganti di sini, atau bagaimana caranya. Saya pasti salah satu dari sedikit yang bingung dengan jawaban Anda.
Kyle Julé
2
Untuk SQL Server 2016 SP1 +, lihat jawaban oleh lad2025.
MBWise
45

Anda dapat menggunakan 'JIKA ADA' untuk memeriksa apakah tampilan ada dan hapus jika ada.

JIKA ADA (PILIH TABLE_NAME DARI INFORMATION_SCHEMA.VIEWS
        WHERE TABLE_NAME = 'MyView')
    DROP LIHAT MyView
PERGILAH

BUAT LIHAT MyView
SEBAGAI 
     ....
PERGILAH
DaveK
sumber
13
Masalahnya adalah Anda kehilangan izin yang mungkin ada di objek yang dijatuhkan.
simon
37

Untuk referensi dari SQL Server 2016 SP1+Anda bisa menggunakan CREATE OR ALTER VIEWsintaks.

MSDN CREATE VIEW :

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

ATAU ALTER

Mengubah tampilan secara bersyarat hanya jika sudah ada.

db <> demo biola

Lukasz Szozda
sumber
Itu sintaks. Anda tidak dapat menggunakan kata kunci BUAT DAN ALTER secara bersamaan seperti yang Anda lakukan di ORACLE. Anda akan mendapatkan kesalahan di bawah jika mencoba seperti ini. - Sintaks yang salah di dekat kata kunci 'OR'. - 'BUAT / ALTER PROSEDUR' harus menjadi pernyataan pertama dalam batch kueri.
Div Tiwari
3
@DivTiwari, ini tampaknya valid di SQL 2016. Hanya butuh SQL Server 11 tahun untuk mengejar ketinggalan dengan fitur oracle ini, rupanya :)
JosephStyons
1
@JosephStyons Memang, Anda benar! Saya tidak mengerti bagaimana mereka bisa begitu lama kehilangan fitur yang begitu penting.
Div Tiwari
@DivTiwari Itu Pilihan Pengembang: BUAT ATAU ALTER Lebih baik terlambat daripada tidak sama sekali :)
Lukasz Szozda
14

Saya menggunakan:

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

...

Baru-baru ini saya menambahkan beberapa prosedur utilitas untuk hal-hal semacam ini:

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

Jadi sekarang saya menulis

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

Saya pikir itu membuat skrip perubahan saya sedikit lebih mudah dibaca

Tom
sumber
7

Saya biasanya menggunakan sesuatu seperti ini:

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 [...]
Michael Petrotta
sumber
5

Pada SQL Server 2016 yang Anda miliki

DROP TABLE IF EXISTS [foo];

Sumber MSDN

Justin Dearing
sumber
3

Ini berfungsi dengan baik untuk saya di 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-

Lex
sumber
Terima kasih, ini bagus. Saya melihat bahwa sintaks ini diperkenalkan di SQL 2016. Ketika saya menulis pertanyaan, itu jauh di SQL 2005.
JosephStyons
2

Anda dapat menggunakan ALTER untuk memperbarui tampilan, tetapi ini berbeda dari perintah Oracle karena ini hanya berfungsi jika tampilan sudah ada. Mungkin lebih baik dengan jawaban DaveK karena itu akan selalu berhasil.

Bryant
sumber
1
Meskipun ALTER mempertahankan Izin yang ada (dan mempertahankan Versi Lama jika versi baru memiliki kesalahan sintaks, dll.). Jadi menggunakan JIKA TIDAK ADA ... untuk membuat Stub, lalu ALTER untuk menggantinya / asli mungkin lebih baik dalam mempertahankan izin dan ketergantungan.
Kristen
1

Di SQL Server 2016 (atau yang lebih baru), Anda dapat menggunakan ini:

CREATE OR ALTER VIEW VW_NAMEOFVIEW AS ...

Dalam versi SQL server yang lebih lama Anda harus menggunakan sesuatu seperti

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

Atau, jika tidak ada ketergantungan pada tampilan, Anda bisa melepaskannya dan membuat ulang:

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 ...
MovGP0
sumber
1
Saya menggunakan SQL Server 2016 (atau yang lebih baru) dan saya tidak dapat menggunakan CREATE OR REPLACE VIEWsintaks. Sintaks yang benar adalah CREATE OR ALTER VIEW. Bagaimana bisa, setiap orang menyatakan itu CREATE OR REPLACEdi setiap utas SO lainnya yang saya temukan 🤔
WoIIe
@Wolle, CREATE OR REPLACE adalah sintaks di Oracle (lihat pertanyaannya)
Eugene Lycenok