এসকিউএল সার্ভারে কোনও ডাটাবেস রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


271

টিএসকিউএল ব্যবহার করে কোনও এসকিউএল সার্ভারে কোনও ডাটাবেস উপস্থিত রয়েছে কিনা তা যাচাই করার আদর্শ উপায় কী? এটি বাস্তবায়নের একাধিক পন্থা বলে মনে হচ্ছে।

উত্তর:


165

মাইক্রোসফ্টের স্ক্রিপ্ট থেকে:

DECLARE @dbname nvarchar(128)
SET @dbname = N'Senna'

IF (EXISTS (SELECT name 
FROM master.dbo.sysdatabases 
WHERE ('[' + name + ']' = @dbname 
OR name = @dbname)))

-- code mine :)
PRINT 'db exists'

7
এটি মাইক্রোসফ্ট স্ক্রিপ্ট থেকে হতে পারে তবে এটি মাইক্রোসফ্টের প্রস্তাবিত অনুশীলন নয়। তারা সরাসরি সিস্টেম টেবিলগুলিতে অ্যাক্সেস না করে INFORMATION_SCHEMA দর্শনগুলি ব্যবহার করে উত্সাহ দেয়।
mwigdahl

4
কেন টেবিলের রেফারেন্স সরাসরি ব্যবহারের পরিবর্তে INFORMATION_SCHEMA ব্যবহার করে উত্সাহ দেওয়া হচ্ছে?
eKek0

4
সাধারণভাবে এটি কারণ মাইক্রোসফ্ট INFORMATION_SCHEMA ফর্ম্যাটটিতে প্রতিশ্রুতি দেয় এবং সিস্টেম টেবিলগুলি তাদের পছন্দমতো পরিবর্তন করার অধিকার সংরক্ষণ করে। তবে এই ক্ষেত্রে, আরও ঘনিষ্ঠভাবে দেখার পরে, INFORMATION_SCHEMA কাজ করে না, সুতরাং এটি সম্ভবত সেরা বিকল্প।
mwigdahl

3
আমি সম্মত হই INFORMATION_SCHEMA একটি ডাটাবেসের ভিতরে ~ বস্তুগুলি পরীক্ষা করার জন্য পছন্দ করা হয়। কিন্তু INFORMATION_SCHEMA নিজেই ডিবি পরীক্ষা করতে ব্যবহার করতে পারে? <<<<<< ............... CHECK_CONSTRAINTS সীমাবদ্ধতাগুলি পরীক্ষা করুন COLUMN_DOMAIN_USAGE প্রতিটি কলামে একটি ব্যবহারকারী-সংজ্ঞায়িত ডেটা টাইপ রয়েছে। COLUMN_PRIVILEGES বর্তমান ডাটাবেসে বর্তমান ব্যবহারকারীর দ্বারা দেওয়া বা বিশেষাধিকার সহ প্রতিটি কলাম। COLUMNS সিস্টেমে প্রতিটি কলাম তালিকাভুক্ত করে CONSTRAINT_COLUMN_USAGE প্রতিটি কলাম যার উপর একটি সীমাবদ্ধতার সংজ্ঞা দেওয়া আছে। CONSTRAINT_TABLE_USAGE প্রতিটি সারণীতে এর সীমাবদ্ধতা রয়েছে।
গ্রানাডা কোডার

2
@ এমভিগডাহল - অনুগ্রহ করে দাবি করা প্রস্তাবিত অনুশীলনের জন্য একটি রেফারেন্স সরবরাহ করুন।
মার্টিন স্মিথ

525

আসলে এটি ব্যবহার করা ভাল:

IF DB_ID('dms') IS NOT NULL
   --code mine :)
   print 'db exists'

Https://docs.microsoft.com/en-us/sql/t-sql/function/db-id-transact-sql দেখুন


3
ভাল এটি অবশ্যই খাটো এবং আরও রহস্যজনক। কৌতূহলের বাইরে, কেন ভাল?
মাইক কে

7
সম্ভবত কারণ ডিবি_আইডি একটি নির্দিষ্ট জায়গায় ডাটাবেসের নাম পরীক্ষা করার চেয়ে নিরাপদ[master]
অ্যান্টনি

4
ঠিক আছে, হ্যাঁ, আরও যে কোনও সংখ্যার জন্য ডিবি_আইডি কোয়েরি থেকে গ্রহণযোগ্য উত্তর চেয়ে ডিবি_আইডি () আরও খারাপ (একই জটিলতা / ব্যয় হতে পারে) হতে পারে এটি প্রায় অসম্ভব। সুতরাং আমি বরং ডিবি_আইডি () বুদ্ধিমান উপায়ে প্রয়োগ করা হচ্ছে, যেহেতু এটি ডেটাবেস বিকাশকারীরা করেছিলেন।
এডুয়ার্ডো

3
আপনার যদি অনুমতি সংক্রান্ত সমস্যা থাকে তবে যেমন [মাস্টার] এ অ্যাক্সেস করার অনুমতি আপনার নেই তবে এটি ভাল কাজ করে!
জেসন ফোগলিয়া

2
@ ম্যাডটিগার: [ ]আপনার কলটিতে আপনাকে অন্তর্ভুক্ত করা উচিত নয় db_id; এটি এসকিউএল সিনট্যাক্স, ডাটাবেসের নামের অংশ নয়।
জ্যাকব ক্রোল

36
IF EXISTS (SELECT name FROM master.sys.databases WHERE name = N'YourDatabaseName')
  Do your thing...

যাইহোক, এটি সরাসরি এসকিউএল সার্ভার স্টুডিও থেকে এসেছে, সুতরাং আপনার যদি এই সরঞ্জামটিতে অ্যাক্সেস থাকে তবে আমি আপনাকে বিভিন্ন "স্ক্রিপ্ট এক্সএক্সএক্সএক্সএক্সএক্সএক্স এএস" ফাংশনগুলির সাথে খেলতে শুরু করার পরামর্শ দিই। আপনার জীবন সহজ করে দেবে! :)


3
যদি 'ইউএসই [মাস্টার]'
অসুবিধে হয় তবে আপনি যে

8

আমি @ এদুয়ার্দোর উত্তর পছন্দ করি এবং আমি গৃহীত উত্তরটি পছন্দ করি। আমি এই জাতীয় কিছু থেকে একটি বুলিয়ান ফিরে পেতে পছন্দ করি, তাই আমি আপনার ছেলেদের জন্য এটি লিখেছিলাম।

CREATE FUNCTION dbo.DatabaseExists(@dbname nvarchar(128))
RETURNS bit
AS
BEGIN
    declare @result bit = 0 
    SELECT @result = CAST(
        CASE WHEN db_id(@dbname) is not null THEN 1 
        ELSE 0 
        END 
    AS BIT)
    return @result
END
GO

এখন আপনি এটি এর মতো ব্যবহার করতে পারেন:

select [dbo].[DatabaseExists]('master') --returns 1
select [dbo].[DatabaseExists]('slave') --returns 0

2

এটা চেষ্টা কর

IF EXISTS 
   (
     SELECT name FROM master.dbo.sysdatabases 
    WHERE name = N'New_Database'
    )
BEGIN
    SELECT 'Database Name already Exist' AS Message
END
ELSE
BEGIN
    CREATE DATABASE [New_Database]
    SELECT 'New Database is Created'
END
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.