SQL सर्वर Oracle के सृजन या समीक्षा दृश्य के बराबर है


115

ओरेकल में, मैं एक बयान के साथ एक दृश्य फिर से बना सकता हूं, जैसा कि यहां दिखाया गया है:

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
मैं तब एक "ड्रॉप" हुआ करता था (पुनः) "जोड़ें" व्यक्ति। लेकिन अब मैं इस प्रकार के समाधान के लिए झुकता हूं (यदि नहीं है, तो बदल दें)।
ग्रेनडाकोडर

ऑल्टर व्यू एक तरह से ड्रॉप से ​​बेहतर है और इसे फिर से बनाना है। क्या होगा यदि आपके पास एक दृश्य के लिए बहुत सारे मौजूदा उपयोगकर्ता सुरक्षा सेटअप हैं, तो आपको उन सभी को फिर से बनाना होगा। यह इस मुद्दे पर मेरा दृष्टिकोण है।
जोनास

आपका सृजन और अलग काम करते हैं .... क्यों? (एक के गतिशील, दूसरे के नहीं, और उनके पास अलग-अलग संदेश हैं।)
जय सुलिवन

मुझे यह भ्रामक लगता है कि आपके क्रिएट व्यू स्टेटमेंट में "ऑल्टर स्टेटमेंट द्वारा प्रतिस्थापित" कैसे शामिल है - इसका क्या मतलब है? यह मेरे लिए भी स्पष्ट नहीं है कि वास्तव में यहाँ किस कोड को प्रतिस्थापित किया जाना चाहिए, या कैसे। मुझे आपके उत्तर से कुछ भ्रमित होना चाहिए।
काइल जूल

2
SQL Server 2016 SP1 + के लिए, lad2025 द्वारा उत्तर देखें।
एमबीवाइज

45

आप यह देखने के लिए कि क्या मौजूद है और ड्रॉप करें या नहीं, यह जांचने के लिए 'IF EXISTS' का उपयोग कर सकते हैं।

IFISTS (INFORMATION_SCHEMA.VIEWS से चयन करें
        जहां TABLE_NAME = 'MyView')
    DROP मेरा दृश्य देखें
जाओ

मेरा दृश्य देखें
जैसा 
     ....
जाओ

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 <> फिडेल डेमो


वह वाक्य-विन्यास है। आप उसी समय ORATE और ALTER दोनों कीवर्ड का उपयोग नहीं कर सकते, जैसे आप ORACLE में करते हैं। यदि आपको इस तरह की कोशिश की जाती है, तो आपको नीचे त्रुटियां प्राप्त होंगी। - 'OR' कीवर्ड के पास गलत सिंटैक्स। - 'क्रिएट / अलर्ट प्रक्रिया' एक क्वेरी बैच में पहला कथन होना चाहिए।
दिव्य तिवारी

3
@DivTiwari, यह जाहिरा तौर पर SQL 2016 में मान्य है। इस oracle सुविधा के साथ पकड़ने के लिए केवल SQL Server 11 साल का समय लगा, जाहिर है :)
जोसेफ्सटाइन्स

1
@JosephStyons वास्तव में, आप सही हैं! मुझे समझ नहीं आ रहा है कि उन्होंने इतने लंबे समय तक इतनी महत्वपूर्ण सुविधा को कैसे याद किया।
दिव्य तिवारी

@DivTiwari यह डेवलपर्स चॉइस थी: क्रिएट ऑर ऑल्टर देवर लेट से बेहतर कभी नहीं :)
लुकाज़ स्ज़ोज़ा

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 में वापस आ गया था।
जोसेफ्सन

2

किसी दृश्य को अपडेट करने के लिए आप ALTER का उपयोग कर सकते हैं, लेकिन यह Oracle कमांड से अलग है क्योंकि यह केवल तभी काम करता है जब दृश्य पहले से मौजूद हो। डेवके के जवाब से शायद बेहतर होगा क्योंकि वह हमेशा काम करेगा।


1
यद्यपि ALTER मौजूदा अनुमतियां रखता है (और पुराने संस्करण को बनाए रखता है यदि नए संस्करण में सिंटैक्स त्रुटियां हैं आदि)। इसलिए स्टब बनाने के लिए IF NOT EXISTS ... का उपयोग करना, और फिर इसे बदलने के लिए ALTER / मूल अनुमति और निर्भरता बनाए रखने में बेहतर हो सकता है।
क्रिस्टन

1

SQL सर्वर 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 सर्वर 2016 (या नए) का उपयोग कर रहा हूं और मैं CREATE OR REPLACE VIEWसिंटैक्स का उपयोग नहीं कर सकता । सही सिंटैक्स है CREATE OR ALTER VIEW। कैसे आता है, कि everybdody बताता है कि यह CREATE OR REPLACEहर दूसरे SO थ्रेड में है मैं 🤔
WoIIe

ओरेकल में क्रीएलेट, क्रीएट या रिप्लेक्स (प्रश्न देखें)
यूजीन लाइकेनोक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.