SQL create database如果不存在,则出现意外行为

Ste*_*L19 14 sql database sql-server sql-server-2014

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

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

如果它不存在,它应该在我的本地服务器上创建数据库.问题是几乎所有的时间它都存在于存储过程的这一部分而不创建它,然后它会干扰同一过程中的其他代码.另一方面,在极少数情况下,它会创建数据库.我的问题是:有没有更好的方法来检查数据库是否存在,因为我已经尝试过至少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;
Run Code Online (Sandbox Code Playgroud)

但是如果我在我的sp之外运行它,它可以很好地工作,这让我觉得它可能是与权限相关的一些问题.

und*_*der 22

尝试使用

 If(db_id(N'DBNAME') IS NULL)
Run Code Online (Sandbox Code Playgroud)

如果不起作用,则可能是权限.这可以解释为什么你没有收到错误信息."...查看相应行所需的最小权限是ALTER ANY DATABASE或VIEW ANY DATABASE服务器级权限,或master数据库中的CREATE DATABASE权限.调用者连接的数据库始终可以在sys.databases中查看"(来自https://msdn.microsoft.com/en-us/library/ms178534.aspx).

您运行的用户具有哪些权限?

尝试更改代码以返回sys.databases的内容,以便您可以看到它.