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的内容,以便您可以看到它.
| 归档时间: |
|
| 查看次数: |
27894 次 |
| 最近记录: |