2008-10-02 64 views
94

Trong Oracle, tôi có thể tái tạo một cái nhìn với một tuyên bố duy nhất, như thể hiện ở đây:Sql Server tương đương với Oracle CREATE OR REPLACE XEM

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

Là cú pháp ngụ ý, điều này sẽ thả các quan điểm cũ và tạo lại nó với bất kỳ định nghĩa nào tôi đã đưa ra.

Có tương đương trong SQL Server 2005 sẽ thực hiện tương tự không?

Trả lời

90

Các giải pháp ở trên mặc dù họ sẽ thực hiện công việc làm như vậy với nguy cơ bỏ quyền người dùng. Tôi thích tạo hoặc thay thế chế độ xem hoặc các thủ tục được lưu trữ như sau.

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

Tôi từng là người "thả" rồi (lại) "Thêm" người. Nhưng bây giờ tôi dựa vào loại giải pháp này (thêm nếu không có, sau đó thay đổi). – granadaCoder

+0

Thay đổi chế độ xem là cách tốt hơn thả và tạo lại. Điều gì sẽ xảy ra nếu bạn có nhiều thiết lập bảo mật người dùng hiện tại cho một chế độ xem, khi đó bạn sẽ phải tạo lại tất cả các thiết lập đó. Đây là cách tiếp cận của tôi cho vấn đề này. – jonas

+0

TẠO VÀ ALTER của bạn làm những việc khác nhau .... tại sao? (Động lực của người kia, người kia thì không, và họ có những thông điệp khác nhau.) –

43

Bạn có thể sử dụng 'IF EXISTS' để kiểm tra xem chế độ xem có tồn tại hay không và xem có đúng không.

 
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS 
     WHERE TABLE_NAME = 'MyView') 
    DROP VIEW MyView 
GO 

CREATE VIEW MyView 
AS 
    .... 
GO 
+10

Vấn đề ở đây là bạn mất bất kỳ điều khoản nào có thể tồn tại trên các đối tượng đó đã giảm xuống. – simon

6

Tôi thường sử dụng một cái gì đó như thế này:

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

Điều này cũng hoạt động với các thủ tục, bảng được lưu trữ, vv – Dave

2

Bạn có thể sử dụng ALTER để cập nhật một cái nhìn, nhưng điều này là khác nhau hơn so với lệnh Oracle vì nó chỉ hoạt động nếu quan điểm đã tồn tại. Có lẽ tốt hơn với câu trả lời của DaveK vì điều đó sẽ luôn hoạt động.

+1

Mặc dù ALTER giữ Quyền hiện tại (và giữ lại Phiên bản Cũ nếu phiên bản mới có lỗi cú pháp, v.v.). Vì vậy, sử dụng IF NOT EXISTS ... để tạo ra một Stub, và sau đó ALTER để thay thế nó/bản gốc có thể tốt hơn trong việc duy trì quyền và phụ thuộc. – Kristen

12

tôi sử dụng:

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

...

Gần đây tôi đã thêm một số thủ tục tiện ích cho loại công cụ này:

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 

Vì vậy, bây giờ tôi viết

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

Tôi nghĩ rằng nó làm cho các thay đổi của tôi có thể đọc được một chút dễ đọc hơn

4

Tính đến SQL Server 2016 bạn có

DROP TABLE IF EXISTS [foo]; 

MSDN source

14

Để tham khảo từ SQL Server 2016 SP1+ bạn có thể sử dụng cú pháp CREATE OR ALTER VIEW.

MSDN CREATE VIEW:

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

HOẶC ALTER

có điều kiện làm thay đổi quan điểm chỉ khi nó đã tồn tại.

+0

Đó là một cú pháp. Bạn không thể sử dụng cả từ khóa CREATE AND ALTER cùng một lúc giống như bạn làm trong ORACLE. bạn sẽ nhận được dưới đây lỗi nếu cố gắng như thế này. - Cú pháp không đúng gần từ khóa 'HOẶC'. - 'TẠO/THAY THẾ THỦ TỤC' phải là câu lệnh đầu tiên trong chuỗi truy vấn. –

+1

@DivTiwari, điều này rõ ràng là hợp lệ trong SQL 2016. Nó chỉ mất SQL Server 11 năm để bắt kịp với tính năng này oracle, rõ ràng :) – JosephStyons

+1

@ JosephStyons Thật vậy, bạn là chính xác! Tôi không hiểu làm thế nào mà họ bỏ lỡ một tính năng quan trọng như vậy trong một thời gian dài. –

1

Nó hoạt động tốt đối với tôi trên 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-

+0

Cảm ơn bạn, điều này tuyệt. Tôi thấy rằng cú pháp này đã được giới thiệu trong SQL 2016. Khi tôi viết câu hỏi, nó đã trở lại trong SQL 2005. – JosephStyons

Các vấn đề liên quan