如何检查SQL Server中是否存在数据库?


271

使用TSQL检查SQL Server上是否存在数据库的理想方法是什么?似乎有多种方法可以实现此目的。

Answers:


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可以用来检查数据库本身吗?<<<<< ............... CHECK_CONSTRAINTS检查约束COLUMN_DOMAIN_USAGE具有用户定义数据类型的每一列。COLUMN_PRIVILEGES在当前数据库中具有当前用户授予或由其授予的特权的每一列。COLUMNS列出系统中的每一列CONSTRAINT_COLUMN_USAGE在其上定义了约束的每一列。CONSTRAINT_TABLE_USAGE每个在其上定义了约束的表。
granadaCoder 2011年

2
@mwigdahl-请提供此要求保护的推荐做法的参考。
马丁·史密斯

525

实际上,最好使用:

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

请参阅https://docs.microsoft.com/zh-cn/sql/t-sql/functions/db-id-transact-sql


3
好吧,它肯定更短,更神秘。出于好奇,为什么会更好?
2014年

7
大概是因为db_id比检查特定位置的数据库名称更安全[master]
安东尼(安东尼)

4
好吧,是的,再加上db_id查询数字,db_id()几乎不可能比接受的答案差(可能是相同的复杂性/成本)。因此,我宁可赌db_id()是以更智能的方式实现的,因为它是由数据库开发人员完成的。
爱德华多

3
如果您有权限问题,例如您没有访问[master]的权限,则效果很好!
杰森·福利亚

2
@MadTigger:您不应加入[ ]对的致电db_id;这是SQL语法,而不是数据库名称的一部分。
雅各布·克拉尔

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.databases”
寻址

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.