จะตรวจสอบว่ามีฐานข้อมูลใน SQL Server ได้อย่างไร


271

เป็นวิธีที่เหมาะในการตรวจสอบว่าฐานข้อมูลอยู่บน SQL Server โดยใช้ TSQL อะไร ดูเหมือนว่ามีหลายวิธีที่จะใช้สิ่งนี้

คำตอบ:


165

จากสคริปต์ของ Microsoft:

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
อาจมาจากสคริปต์ของ Microsoft แต่ไม่ใช่แนวทางปฏิบัติที่ Microsoft แนะนำ พวกเขาสนับสนุนให้ใช้มุมมอง Information_SCHEMA แทนที่จะเข้าถึงตารางระบบโดยตรง
mwigdahl

4
เหตุใดจึงสนับสนุนให้ใช้ INFORMATION_SCHEMA แทนที่จะใช้การอ้างอิงไปยังตารางโดยตรง
eKek0

4
โดยทั่วไปเป็นเพราะ Microsoft ยอมรับรูปแบบ INFORMATION_SCHEMA และขอสงวนสิทธิ์ในการเปลี่ยนแปลงตารางระบบตามที่พวกเขาต้องการ แต่ในกรณีนี้หลังจากดูข้อมูลเพิ่มเติมอย่างละเอียด Information_SCHEMA จะไม่ทำงานดังนั้นนี่อาจเป็นตัวเลือกที่ดีที่สุด
mwigdahl

3
ฉันเห็นด้วยกับ Information_SCHEMA เป็นที่ต้องการสำหรับการตรวจสอบวัตถุ ~ ภายในฐานข้อมูล แต่ INFORMATION_SCHEMA สามารถใช้เพื่อตรวจสอบ db เองได้หรือไม่? <<<<< ............... CHECK_CONSTRAINTS ตรวจสอบข้อ จำกัด COLUMN_DOMAIN_USAGE ทุกคอลัมน์ที่มีประเภทข้อมูลที่ผู้ใช้กำหนด COLUMN_PRIVILEGES ทุกคอลัมน์ที่มีสิทธิ์ให้กับผู้ใช้ปัจจุบันหรือในฐานข้อมูลปัจจุบัน COLUMNS แสดงรายการทุกคอลัมน์ในระบบ CONSTRAINT_COLUMN_USAGE ทุกคอลัมน์ที่มีข้อ จำกัด ที่กำหนดไว้ CONSTRAINT_TABLE_USAGE ทุกตารางที่มีข้อ จำกัด ที่กำหนดไว้
granadaCoder

2
@mwigdahl - โปรดให้ข้อมูลอ้างอิงสำหรับการปฏิบัติที่อ้างสิทธิ์นี้
Martin Smith

526

ที่จริงแล้ววิธีที่ดีที่สุดคือใช้:

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

ดูhttps://docs.microsoft.com/en-us/sql/t-sql/functions/db-id-transact-sql


3
มันสั้นกว่าและซ่อนเร้นอย่างแน่นอน จากความอยากรู้ทำไมมันจะดีกว่า
Mike K

7
น่าจะเป็นเพราะ db_id ปลอดภัยกว่าการตรวจสอบชื่อฐานข้อมูลในตำแหน่งเฉพาะใน[master]
Anthony

4
ใช่รวมทั้งเป็นไปไม่ได้ที่ db_id () จะแย่ลง (อาจมีความซับซ้อน / ค่าใช้จ่ายเท่ากัน) กว่าคำตอบที่ยอมรับเนื่องจากคำสั่ง db_id เป็นตัวเลข ดังนั้นฉันจึงควรเดิมพัน db_id () ถูกนำมาใช้อย่างชาญฉลาดเนื่องจากผู้พัฒนาฐานข้อมูลทำ
Eduardo

3
หากคุณมีปัญหาการอนุญาตเช่นคุณไม่มีสิทธิ์ในการเข้าถึง [master] วิธีนี้ใช้ได้ดี!
Jason Foglia

2
@MadTigger: คุณไม่ควรรวม[ ]ในการเรียกร้องให้db_id; นั่นคือไวยากรณ์ SQL ไม่ใช่ส่วนหนึ่งของชื่อฐานข้อมูล
Jacob Krall

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

สิ่งนี้มาจาก SQL Server Studio โดยตรงดังนั้นหากคุณสามารถเข้าถึงเครื่องมือนี้ได้ฉันขอแนะนำให้คุณเริ่มเล่นด้วยฟังก์ชั่น "Script xxxx AS" ที่มีอยู่ จะทำให้ชีวิตของคุณง่ายขึ้น! :)


3
หาก 'USE [Master]' ไม่สะดวกคุณสามารถระบุมุมมองมุมมองโดยตรงจากฐานข้อมูลใด ๆ ว่า 'master.sys.database'
ProfK

8

ฉันชอบคำตอบของ @ Eduardo และฉันชอบคำตอบที่ยอมรับได้ ฉันชอบกลับบูลีนจากบางสิ่งเช่นนี้ดังนั้นฉันจึงเขียนมันให้คุณ

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.