SQL Server เทียบเท่ากับ CREATE OR REPLACE VIEW ของ 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

สร้างและแก้ไขของคุณทำสิ่งที่แตกต่างกัน .... ทำไม? (พลวัตของคนอื่นไม่ใช่ของอีกคนและมีข้อความที่แตกต่างกัน)
Jay Sullivan

ฉันรู้สึกสับสนว่าคำสั่ง CREATE VIEW ของคุณเกี่ยวข้องกับ "แทนที่ด้วย Alter Statement" อย่างไร - หมายความว่าอย่างไร ฉันยังไม่ชัดเจนสำหรับฉันว่าควรจะเปลี่ยนรหัสอะไรที่นี่หรืออย่างไร ฉันต้องเป็นหนึ่งในไม่กี่คนที่สับสนกับคำตอบของคุณ
Kyle Julé

2
สำหรับ SQL Server 2016 SP1 + โปรดดูคำตอบโดย lad2025
MBWise

45

คุณสามารถใช้ 'IF EXISTS' เพื่อตรวจสอบว่ามีมุมมองอยู่หรือไม่และจะลดลงหากมี

IF EXISTS (เลือกตารางจาก INFORMATION_SCHEMA.VIEWS
        WHERE TABLE_NAME = 'MyView')
    ดู MyView
ไป

สร้างมุมมอง MyView
เช่น 
     ....
ไป

13
ปัญหานี้คือคุณสูญเสียสิทธิ์ใด ๆ ที่อาจมีอยู่ในวัตถุที่ตกหล่น
ไซมอน

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 <> การสาธิตซอ


นั่นคือไวยากรณ์ คุณไม่สามารถใช้ทั้งสร้างและแก้ไขคำหลักในเวลาเดียวกันได้เหมือนที่คุณทำใน ORACLE คุณจะได้รับข้อผิดพลาดด้านล่างหากพยายามเช่นนี้ - ไวยากรณ์ไม่ถูกต้องใกล้กับคีย์เวิร์ด 'OR' - "สร้าง / แก้ไขขั้นตอน" ต้องเป็นคำสั่งแรกในชุดข้อความค้นหา
Div Tiwari

3
@DivTiwari เห็นได้ชัดว่าสิ่งนี้ใช้ได้ใน SQL 2016 ใช้เวลาเพียง 11 ปี SQL Server ในการติดตามคุณลักษณะ oracle นี้เห็นได้ชัด :)
JosephStyons

1
@JosephStyons แน่นอนคุณถูกต้อง! ฉันไม่เข้าใจว่าพวกเขาพลาดฟีเจอร์สำคัญแบบนี้ไปนานขนาดนี้ได้อย่างไร
Div Tiwari


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


3

มันใช้งานได้ดีสำหรับฉันใน 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-


ขอบคุณนี่ยอดเยี่ยมมาก ฉันเห็นว่าไวยากรณ์นี้ถูกนำมาใช้ใน SQL 2016 เมื่อฉันเขียนคำถามมันย้อนกลับไปใน SQL 2005
JosephStyons

2

คุณสามารถใช้ ALTER เพื่ออัปเดตมุมมองได้ แต่จะแตกต่างจากคำสั่ง Oracle เนื่องจากจะใช้งานได้ก็ต่อเมื่อมีมุมมองอยู่แล้ว อาจจะดีกว่าด้วยคำตอบของ DaveK เนื่องจากจะได้ผลเสมอ


1
แม้ว่า ALTER จะเก็บสิทธิ์ที่มีอยู่ไว้ (และยังคงเป็นเวอร์ชันเก่าหากเวอร์ชันใหม่มีข้อผิดพลาดทางไวยากรณ์เป็นต้น) ดังนั้นการใช้ IF NOT EXISTS ... เพื่อสร้าง Stub จากนั้นแก้ไขเพื่อแทนที่ / ต้นฉบับอาจดีกว่าในการรักษาสิทธิ์และการอ้างอิง
Kristen

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ไวยากรณ์ที่ถูกต้องคือ ทำไมCREATE OR REPLACEทุกคนบอกว่ามันอยู่ในเธรด SO อื่น ๆ ที่ฉันพบ🤔
WoIIe

@Wolle, CREATE OR REPLACE เป็นไวยากรณ์ใน Oracle (ดูคำถาม)
Eugene Lycenok
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.