我有一个很长的存储过程,它以下面的语句开头:
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之外运行它,它可以完美地工作,这让我觉得它可能是与权限相关的一些问题。
答案 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