ডেটাবেসে ভিউ বিদ্যমান আছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?


127

আমার কাছে কিছু এসকিউএল কোড রয়েছে যা একটি ডেটাবেজে নির্দিষ্ট ভিউ বিদ্যমান থাকলে কার্যকর করতে হবে uted ভিউটি বিদ্যমান থাকলে আমি কীভাবে চেক করতে যাব?

সম্পাদনা: যে ডিবিএমএস ব্যবহার করা হচ্ছে তা হ'ল মাইক্রোসফ্ট এসকিউএল সার্ভার

উত্তর:


161

এসকিউএল সার্ভারের জন্য

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

7
আপনি সম্ভবত sys.schemaএখানে যোগদান করতে চান ।
এরিক

ত্রুটি - অবৈধ অবজেক্টের নাম 'sys.views'। আমি মাস্টার ডিবি-কে জিজ্ঞাসা করছিলাম
স্টিপ

যদি আপনি এটি দেখতে (যেমনটি করেছিলেন) হিসাবে তৈরি এবং অলটারের মধ্যে স্থির করে দেখতে পান তবে এটি দর্শকদের পক্ষে কাজ করে না - আপনাকে ভিউ * ফেলে দিতে হবে এবং তারপরে এটি তৈরি করতে হবে। যদি উপস্থিতি এখনও ভিউটি ড্রপিংয়ের জন্য ভাল কাজ করে, তাই ধন্যবাদ! :) * আপনি যখন কোনও অনুমতি সম্পর্কে ভুলবেন না। ;)
ফ্রস্টবাইটএক্সআইআইআই

এটা চেষ্টা কর. যদি এটি উপস্থিত না থাকে তবে ভিউ তৈরি করুন (কেবল একটি স্টাব) এবং তারপরে আপনার আপডেটগুলি রাখতে সেই স্টাবকে পরিবর্তন করুন That এভাবে আপনাকে কখনই ছাড়তে হবে না। স্ট্রাকচারডাইটটাইট
ডটকম /

সম্ভবত কোনও উক্তিটি যাচাই করা হচ্ছে তার নাম রাখা উচিত? অন্যথায় এটি কখনও কাজ করবে না :)
বিপরীত প্রকৌশলী

138

ইতিমধ্যে উপরে উল্লিখিত অনেকগুলি উপায় রয়েছে তবে আমার প্রিয় একটি অনুপস্থিত ..

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

nViewদেখার নাম যেখানে

আপডেট ২০১ 2017-০৩-২৫ : যেমন @hanesjw এর দ্বিতীয় যুক্তির Pপরিবর্তে স্টোর প্রক্রিয়া ব্যবহার বাদ দেওয়ার পরামর্শ দিয়েছিলVOBJECT_ID

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

4
আমার এটা ভাল লেগেছে. আপনি টেবিলগুলির জন্য 'ইউ' ব্যবহার করতে পারেন।
ফিলিপ সেন

2
বা সঞ্চিত পদ্ধতির জন্য 'পি'। যদি OBJECT_ID ('dbo.sprocName', 'P') নকল ড্রপ প্রক্রিয়া নয় dbo.sprocName; যান
hanesjw

আমি জানি না এটি ২০০৯ সালের সেরা উত্তর ছিল কিনা তবে এটি ২০১ 2016 সালে বলে মনে হচ্ছে (যদিও এসকিউএল সার্ভার ২০১ 2016 আরও উন্নত বিকল্পটি প্রবর্তন করছে)।
এরিক জে

1
OBJECT_ID ডক msdn.microsoft.com/en-us/library/ms190328.aspx : - এবং আপনার ডিভাইসে এক আপনি দেয় সব বস্তুর ধরনের msdn.microsoft.com/en-us/library/ms190324.aspx
Simon_Weaver

55

এটি সর্বাধিক বহনযোগ্য, অন্তত অনুপ্রবেশমূলক উপায়:

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

সম্পাদনা করুন: এটি এসকিউএল সার্ভারে কাজ করে, এবং sys.schemasদৃশ্যের স্কিমা পেতে আপনাকে যোগদানের প্রয়োজন হয় না । সবকিছু থাকলে এটি কম গুরুত্বপূর্ণdbo আপনি যদি স্কিমার ভাল ব্যবহার করছেন তবে আপনার এটি মনে রাখা উচিত।

প্রতিটি আরডিবিএমএস এর মতো মেটাডেটা যাচাই করার নিজস্ব সামান্য উপায় রয়েছে তবে information_schemaএটি আসলে এএনএসআই এবং আমি মনে করি ওরাকল এবং স্পষ্টতই এসকিউএলাইটই কেবল এটি কোনও ফ্যাশনে সমর্থন করে না।


3
স্ক্লাইট ব্যবহার করে: এসকিউএল ত্রুটি: এর মতো কোনও টেবিল নেই: INFORMATION_SCHEMA.VIEWS

@lutz: +1, এসকিউএলাইটে সহায়তার অভাবে।
অ্যালিক্স অ্যাক্সেল

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

মাইক্রোসফ্ট এসকিউএল সার্ভারের জন্য, আমি এটি সর্বাধিক দরকারী বলে মনে করি যদি স্কিমা পরিচালনার স্ক্রিপ্ট তৈরি করার সময় প্রায়শই ব্যবহার করা হয়। স্ক্রিপ্টটিতে সম্ভবত আপনার কাছে ইতিমধ্যে তৈরি করুন [ডিবিও] রয়েছে [[মাইভিউ] এবং উপরেরটি অনুলিপি এবং পেস্ট করার জন্য এই স্নিপেটটি is
জিমি বোস

15

লোকেরা অস্তিত্ব যাচাই করে এটি Viewব্যবহার বাদ দেয়

আপনার কাছ থেকে বড় মোড়কের পরিবর্তে SQL Server 2016 CTP3নতুন ডিআইই বিবৃতি ব্যবহার করতে পারেনIF

বাক্য গঠন

ড্রপ ভিউ [যদি উপস্থিত থাকে] [স্কিমা_নাম। ] ভিউ_নাম [..., n] [; ]

প্রশ্ন :

DROP VIEW IF EXISTS view_name

আরও তথ্য এখানে


1

যদি এটি ওরাকল হয় তবে আপনি "সমস্ত_দর্শন" টেবিলটি ব্যবহার করবেন।

এটি সত্যিই আপনার ডিবিএমের উপর নির্ভর করে।


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

এসকিউএল সার্ভারে,

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

আপনি বিভিন্ন উপায়ে ভিউটির প্রাপ্যতা পরীক্ষা করতে পারেন

এসকিউএল সার্ভারের জন্য

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

সিসোবজেক্টগুলি ব্যবহার করুন

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.