अगर डेटाबेस में कोई दृश्य मौजूद है, तो मैं कैसे जांच सकता हूं?


127

मेरे पास कुछ एसक्यूएल कोड हैं जिन्हें एक निश्चित दृश्य डेटाबेस में मौजूद होने पर निष्पादित करने की आवश्यकता है। अगर दृश्य मौजूद है तो मैं जाँच के बारे में कैसे जाऊँगा?

संपादित करें: उपयोग किया जा रहा DBMS Microsoft SQL सर्वर है

जवाबों:


161

SQL सर्वर के लिए

IF EXISTS(select * FROM sys.views where name = '')

7
आप शायद sys.schemaयहां भी शामिल होना चाहते हैं ।
एरिक

त्रुटि -वास्तविक वस्तु नाम 'sys.views'। मैं
स्टीम

अगर आपको यह देखने के लिए (जैसा मैंने किया था) के लिए एक CREATE और ALTER के बीच तय करने के लिए मिला, तो यह VIEWs के लिए काम नहीं करता है - आपको VIEW * को ड्रॉप करना होगा और फिर इसे क्रिएट करना होगा। IF EXISTS अभी भी VOW को देखने के लिए ठीक काम करता है, इसलिए धन्यवाद! :) * किसी भी अनुमति के बारे में मत भूलना जब आप करते हैं। ;)
फ्रॉस्टबाइटएक्स आठ

इसे इस्तेमाल करे। यदि यह मौजूद नहीं है तो दृश्य (सिर्फ एक ठूंठ) बनाएं और फिर उस ठूंठ को बदलकर अपना अपडेट डाल दें। इस तरह आपको इसे कभी नहीं छोड़ना है। स्ट्रक्चर्ड्सडाइट.कॉम
2014

संभवतया किसी को देखने के नाम को उद्धरणों में जाँचना चाहिए? अन्यथा यह कभी काम नहीं करेगा :)
उल्टा इंजीनियर 12

138

ऊपर पहले से ही कई तरीके निर्दिष्ट हैं लेकिन मेरी पसंदीदा में से एक गायब है ..

GO
IF OBJECT_ID('nView', 'V') IS NOT NULL
    DROP VIEW nView;
GO

जहां nViewदेखने का नाम है

UPDATE 2017-03-25: जैसा कि @hanesjw ने दूसरे तर्क के Pबजाय एक स्टोर प्रक्रिया प्रक्रिया को छोड़ने का सुझाव दियाVOBJECT_ID

GO
IF OBJECT_ID( 'nProcedure', 'P' ) IS NOT NULL 
    DROP PROCEDURE dbo.sprocName; 
GO

4
मैं यह पसंद है। आप टेबलों के लिए भी 'यू' का उपयोग कर सकते हैं।
फिलिप सन् 19

2
या संग्रहीत प्रक्रियाओं के लिए 'पी'। अगर OBJECT_ID ('dbo.sprocName', 'P') पूर्ण नहीं है, तो DROP PROCEDURE dbo.sprocName; गो
१45

मुझे नहीं पता कि यह 2009 में सबसे अच्छा जवाब था, लेकिन यह 2016 में लगता है (हालांकि SQL सर्वर 2016 एक और भी बेहतर विकल्प पेश कर रहा है)।
एरिक जे।

1
OBJECT_ID doc msdn.microsoft.com/en-us/library/ms190328.aspx - और यह एक आपको सभी ऑब्जेक्ट प्रकार देता है: msdn.microsoft.com/en-us/library/ms90324.aspx
Simon_Weaver

55

यह सबसे पोर्टेबल, कम से कम घुसपैठ तरीका है:

select
    count(*)
from
    INFORMATION_SCHEMA.VIEWS
where
    table_name = 'MyView'
    and table_schema = 'MySchema'

संपादित करें: यह SQL सर्वर पर काम करता है, और इसे sys.schemasदेखने के स्कीमा प्राप्त करने के लिए आपको शामिल होने की आवश्यकता नहीं है । यह सब कुछ कम महत्वपूर्ण है dbo, लेकिन यदि आप स्कीमा का अच्छा उपयोग कर रहे हैं, तो आपको इसे ध्यान में रखना चाहिए।

प्रत्येक RDBMS का मेटाडेटा की जाँच करने का अपना छोटा तरीका है, लेकिन information_schemaयह वास्तव में ANSI है, और मुझे लगता है कि Oracle और जाहिरा तौर पर SQLite ही ऐसे हैं जो कुछ फैशन में इसका समर्थन नहीं करते हैं।


3
Sqlite का उपयोग करना: SQL त्रुटि: ऐसी कोई तालिका नहीं: INFORMATION_SCHEMA.VIEWS

SQLite पर समर्थन की कमी के लिए @lutz: +1।
एलिक्स एक्सल

18
if exists (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') )

Microsoft SQL सर्वर के लिए, मुझे यह सबसे उपयोगी लगता है क्योंकि स्कीमा प्रबंधन स्क्रिप्ट बनाते समय IF EXISTS का उपयोग अक्सर किया जाता है। स्क्रिप्ट में संभवतः आपके पास पहले से ही क्रिएट वीव्यू [dbo] है। [MyView] और ऊपर कॉपी और पेस्ट के लिए यह सबसे सरल स्निपेट है।
जिमी बोस 16

15

Viewइसका उपयोग छोड़ने के लिए अस्तित्व की जाँच कर रहे लोगों के लिए

से SQL Server 2016 CTP3आप नए उपयोग कर सकते हैं DIE बड़ा बजाय बयान IFरैपर

वाक्य - विन्यास

DROP VIEW [IF EXISTS] [स्कीमा_नाम। ] view_name [..., n] [; ]

प्रश्न:

DROP VIEW IF EXISTS view_name

अधिक जानकारी यहाँ


1

यदि यह ओरेकल है तो आप "all_views" तालिका का उपयोग करेंगे।

यह वास्तव में आपके dbms पर निर्भर करता है।


1

यदि आप सभी मौजूदा विचारों की वैधता और स्थिरता की जांच करना चाहते हैं, तो आप निम्नलिखित प्रश्न का उपयोग कर सकते हैं

declare @viewName sysname
declare @cmd sysname
DECLARE check_cursor CURSOR FOR 
SELECT cast('['+SCHEMA_NAME(schema_id)+'].['+name+']' as sysname) AS viewname
FROM sys.views

OPEN check_cursor
FETCH NEXT FROM check_cursor 
INTO @viewName

WHILE @@FETCH_STATUS = 0
BEGIN

set @cmd='select * from '+@viewName
begin try
exec (@cmd)
end try
begin catch
print 'Error: The view '+@viewName+' is corrupted .'
end catch
FETCH NEXT FROM check_cursor 
INTO @viewName
END 
CLOSE check_cursor;
DEALLOCATE check_cursor;

1

SQL सर्वर में,

declare @ViewName nvarchar(20)='ViewNameExample'

if exists(SELECT 1 from sys.objects where object_Id=object_Id(@ViewName) and Type_Desc='VIEW')
begin
    -- Your SQL Code goes here ...

end

0

केविन के जवाब पर विस्तार करने के लिए।

    private bool CustomViewExists(string viewName)
    {
        using (SalesPad.Data.DataConnection dc = yourconnection)
        {
            System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(String.Format(@"IF EXISTS(select * FROM sys.views where name = '{0}')
                Select 1
            else
                Select 0", viewName));
            cmd.CommandType = CommandType.Text;
            return Convert.ToBoolean(dc.ExecuteScalar(cmd));
        }
    }

0

आप विभिन्न तरीकों से दृश्य की उपलब्धता की जांच कर सकते हैं

SQL सर्वर के लिए

sys.objects का उपयोग करें

IF EXISTS(
   SELECT 1
   FROM   sys.objects
   WHERE  OBJECT_ID = OBJECT_ID('[schemaName].[ViewName]')
          AND Type_Desc = 'VIEW'
)
BEGIN
    PRINT 'View Exists'
END

sysobjects का उपयोग करें

IF NOT EXISTS (
   SELECT 1
   FROM   sysobjects
   WHERE  NAME = '[schemaName].[ViewName]'
          AND xtype = 'V'
)
BEGIN
    PRINT 'View Exists'
END

sys.views का उपयोग करें

IF EXISTS (
   SELECT 1
   FROM sys.views
   WHERE OBJECT_ID = OBJECT_ID(N'[schemaName].[ViewName]')
)
BEGIN
    PRINT 'View Exists'
END

INFORMATION_SCHEMA.VIEWS का उपयोग करें

IF EXISTS (
   SELECT 1
   FROM   INFORMATION_SCHEMA.VIEWS
   WHERE  table_name = 'ViewName'
          AND table_schema = 'schemaName'
)
BEGIN
    PRINT 'View Exists'
END

OBJECT_ID का उपयोग करें

IF EXISTS(
   SELECT OBJECT_ID('ViewName', 'V')
)
BEGIN
    PRINT 'View Exists'
END

sys.sql_modules का उपयोग करें

IF EXISTS (
   SELECT 1
   FROM   sys.sql_modules
   WHERE  OBJECT_ID = OBJECT_ID('[schemaName].[ViewName]')
)
BEGIN
   PRINT 'View Exists'
END
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.