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

时间:2016-11-28 06:39:42

标签: sql sql-server database sql-server-2014

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

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之外运行它,它可以完美地工作,这让我觉得它可能是与权限相关的一些问题。

4 个答案:

答案 0 :(得分:16)

尝试使用

 If(db_id(N'DBNAME') IS NULL)

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

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

尝试更改代码,只返回sys.databases的内容,以便查看。

答案 1 :(得分:2)

问题似乎在于缺少终止语句的“ 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]

特洛伊。 #

答案 2 :(得分:1)

插入是因为我有一个类似的问题:我想创建一个数据库(如果它不存在),然后对该数据库执行操作。

我认为问题在于该脚本试图分批运行,因此它试图在SQL Server收到USE命令之前CREATE数据库。 这导致整个脚本被还原,问题的根源似乎是从未创建过数据库。

在我的情况下,解决方案是在脚本的最初部分(创建表)之后到add a GO command,但在我开始使用它之前(例如创建表)。

答案 3 :(得分:-1)

比较字符串时使用LIKE

if (SELECT count(name) FROM sys.databases WHERE name LIKE '%DBNAME%') = 0