【问题标题】:How to check if a database exists in SQL Server?如何检查 SQL Server 中是否存在数据库?
【发布时间】:2010-10-15 07:21:48
【问题描述】:

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

【问题讨论】:

    标签: sql-server database tsql


    【解决方案1】:

    其实最好用:

    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 并注意这对 Azure SQL 数据库没有意义。

    【讨论】:

    • 嗯,它肯定更短,更神秘。出于好奇,为什么它更好?
    • 大概是因为 db_id 比在 [master] 的特定位置检查数据库名称更安全
    • 嗯,是的,再加上 db_id() 几乎不可能比接受的答案更糟(可能是相同的复杂性/成本),因为 db_id 查询一个数字。所以我宁愿打赌 db_id() 会以更智能的方式实现,因为它是由数据库开发人员完成的。
    • 如果您有权限问题,例如您没有访问 [master] 的权限,这很好用!
    • 不确定这是否适用于所有情况...我试过了,结果不正确,所以我写了一个快速测试:use [X] go if db_id('[X]') IS NULL print 'db 不存在' 当我运行它时,我发现 db_id 调用似乎总是返回 null。
    【解决方案2】:

    来自微软的脚本:

    DECLARE @dbname nvarchar(128)
    SET @dbname = N'Senna'
    
    IF (EXISTS (SELECT name 
    FROM master.dbo.databases 
    WHERE ('[' + name + ']' = @dbname 
    OR name = @dbname)))
    

    【讨论】:

    • 这可能来自 Microsoft 脚本,但这不是 Microsoft 推荐的做法。他们鼓励使用 INFORMATION_SCHEMA 视图而不是直接访问系统表。
    • 为什么鼓励使用 INFORMATION_SCHEMA 而不是直接使用对表的引用?
    • 一般是因为微软承诺INFORMATION_SCHEMA格式,并保留随意更改系统表的权利。但在这种情况下,仔细观察后,INFORMATION_SCHEMA 不起作用,所以这可能是最好的选择。
    • 我同意 INFORMATION_SCHEMA 更适合检查数据库内的对象。但是 INFORMATION_SCHEMA 可以用来检查数据库本身吗?
    • @mwigdahl - 请为此声称的推荐做法提供参考。
    【解决方案3】:
    IF EXISTS (SELECT name FROM master.sys.databases WHERE name = N'YourDatabaseName')
      Do your thing...
    

    顺便说一句,这直接来自 SQL Server Studio,所以如果您可以使用此工具,我建议您开始使用各种可用的“Script xxxx AS”功能。会让你的生活更轻松! :)

    【讨论】:

    • 如果 'USE [Master]' 不方便,可以直接将任意数据库中的视图视图寻址为 'master.sys.databases'
    【解决方案4】:

    我喜欢@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
    

    【讨论】:

      【解决方案5】:

      试试这个

      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
      

      【讨论】:

        【解决方案6】:
          Public Function SQLDatabaseExist(ByVal DefaultConnectionString As String, ByVal DataBaseName As String) As Boolean
        Try
            'CREATE DATABASE
            Dim SqlString As String = ""
            SqlString = "SELECT CASE WHEN EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'" & DataBaseName & "') THEN CAST (1 AS BIT) ELSE CAST (0 AS BIT) END"
            Dim ExcRet As Integer = 0
            Using connection As New SqlConnection(DefaultConnectionString)
                Dim command As New SqlCommand(SqlString, connection)
                command.Connection.Open()
                ExcRet = command.ExecuteScalar()
                command.Connection.Close()
                command.Dispose()
            End Using
            Return ExcRet
        Catch ex As Exception
            Return False
        End Try
        

        结束函数

        ''注意连接字符串中的初始目录必须是master! '示例默认连接字符串

        Dim DefaultConnectionString As String = "Data Source=localhost\SQLSERVER2008;Initial Catalog=Master; User ID=SA; Password='123123'; MultipleActiveResultSets=false; Connect Timeout=15;Encrypt=False;Packet Size=4096;"
        

        【讨论】:

          猜你喜欢
          • 2020-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-03
          • 1970-01-01
          • 2010-09-18
          • 2012-02-13
          • 1970-01-01
          相关资源
          最近更新 更多