我创建了一个包含数据库逻辑名称的变量,如果在我的LocalDB
中存在,则将其删除。
我在当前代码中遇到的问题是它只搜索现有数据库的物理名称。
(我有一个逻辑名称为'Development'的数据库,它不会被删除)。
DECLARE @dbname nvarchar(128)
SET @dbname = 'Development'
IF(EXISTS(SELECT NULL FROM sys.databases
WHERE ('[' + name + ']' = @dbname OR name = @dbname )))
BEGIN
DECLARE @sql VARCHAR(MAX)
SELECT @sql = COALESCE(@sql,'') + 'Kill ' + Convert(varchar, SPId) + ';'
FROM MASTER..SysProcesses
WHERE DBId = DB_ID(@dbname) AND SPId <> @@SPId
EXEC(@sql)
EXEC('DROP DATABASE ' + @dbname);
PRINT 'Existing database removed'
END
ELSE
BEGIN
PRINT 'Database not present';
END
我得到的结果是打印'数据库不存在',并且不删除数据库。我想要的是一个删除的数据库(.mdf
和.ldf
)
数据库没有逻辑名称“development”。它包含的文件之一具有该逻辑名称。
要获取与您可以使用的逻辑文件名对应的数据库名称
SELECT DB_NAME(database_id)
FROM sys.master_files
WHERE name = 'Development'
然后将其分配给@dbname
- 可能会有多个结果。无法保证逻辑文件名在数据库中是唯一的
执行查询的用户可能没有查看数据库的权限。
如果sys.databases的调用者不是数据库的所有者且数据库不是master或tempdb,则查看相应行所需的最小权限是ALTER ANY DATABASE或VIEW ANY DATABASE服务器级权限或CREATE DATABASE权限在master数据库中。始终可以在sys.databases中查看呼叫者所连接的数据库。
尝试在SSMS中运行以下查询以检查是否可以看到您的数据库。
SELECT * FROM sys.databases