【问题标题】:Check If Database Exists in SQL Server检查 SQL Server 中是否存在数据库
【发布时间】:2020-08-16 11:18:51
【问题描述】:

我正在处理具有多个数据库的项目。数据库可能不存在。在对表运行查询之前,我正在检查数据库是否存在。问题是我仍然没有退出数据库“课程”。我想摆脱那条消息,因为我不希望客户看到这条消息。

DECLARE @dbname nvarchar(128)
SET @dbname = N'Courses'

IF EXISTS (SELECT name 
FROM master.dbo.sysdatabases 
WHERE ('[' + name + ']' = @dbname 
OR name = @dbname))
  BEGIN
    IF NOT EXISTS (SELECT 1 FROM Courses.INFORMATION_SCHEMA.COLUMNS C WHERE C.COLUMN_NAME IN ('isAvailableOnline') AND C.TABLE_NAME IN ('Course'))
    BEGIN
       ALTER TABLE Courses.dbo.Course ADD isAvailableOnline BIT NULL
    END
  END

【问题讨论】:

  • 旁白:您应该使用QuoteName 来引用对象名称,而不是'[' + name + ']'
  • @HABO,谢谢,我一定会改用 QuoteName 代替。
  • 无论如何您都不需要为此烦恼,因为dbo.sysdatabases 中的名称将不加引号地存储。并且dbo.sysdatabases 已被弃用(由sys.databases 替换,它也将被取消)
  • @MartinSmith - 在这种情况下,似乎 OP 正在使用 @dbname 作为 可能 已被引用的参数,因此尝试将其与来自的值匹配带或不带引号的表。是的,他们应该使用sys.databases
  • 啊,是的,错过了。 DB_ID 无论如何都不关心它是否被引用

标签: tsql sql-server-2012


【解决方案1】:

使用EXEC 中可能不存在的数据库包装表达式,因此只有在采用该分支时才会编译它。

我使用了一些较短的习语来检查数据库和列的存在。如果您坚持使用现有的列,则需要进入EXECed 的字符串内,并将引号加倍以转义它们。

DECLARE @dbname sysname
SET @dbname = N'Courses'

IF DB_ID(@dbname) IS NOT NULL
  BEGIN
    IF COL_LENGTH('Courses.dbo.Course','isAvailableOnline') IS NULL
    BEGIN
       EXEC('ALTER TABLE Courses.dbo.Course ADD isAvailableOnline BIT NULL')
    END
  END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 2015-06-25
    • 2010-09-15
    • 2019-08-16
    相关资源
    最近更新 更多