SQL 创建数据库,如果不存在,意外行为

新手上路,请多包涵

我有一个很长的存储过程,它以以下语句开头:

 IF  NOT EXISTS (SELECT * FROM sys.databases WHERE name = N'DBNAME')
    BEGIN
        CREATE DATABASE [DBNAME]
    END;

如果不存在,则应在我的本地服务器上创建数据库。问题是几乎所有时间它都通过存储过程的这一部分而不创建它,这会干扰来自同一过程的其他代码。另一方面,在极少数情况下,它会创建数据库。我的问题是:有没有更好的方法来检查数据库是否存在,因为我已经尝试了至少 10 个。

我尝试的其他方法:

 IF  NOT EXISTS (SELECT 1 FROM sys.databases WHERE name = N'DBNAME')
    BEGIN
        CREATE DATABASE [DBNAME]
    END;

IF  NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'DBNAME')
        BEGIN
            CREATE DATABASE [DBNAME]
        END;

IF  NOT EXISTS (SELECT name FROM master.dbo.sys.databases WHERE name = N'DBNAME')
            BEGIN
                CREATE DATABASE [DBNAME]
        END;

但是如果我在我的 sp 之外运行它,它会完美运行,这让我认为它可能是与权限相关的一些问题。

原文由 StefanL19 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 732
1 个回答

问题似乎是缺少“GO”来终止语句。这不起作用…

 IF NOT EXISTS(SELECT 1 FROM sys.databases WHERE name='dba')
    CREATE DATABASE [dba]

USE [dba]

但是,这确实…

 IF NOT EXISTS(SELECT 1 FROM sys.databases WHERE name='dba')
    CREATE DATABASE [dba]
GO
USE [dba]

特洛伊。 #

原文由 Troy Frericks 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进