【问题标题】:How to check if a given database exists on the server?如何检查服务器上是否存在给定的数据库?
【发布时间】:2020-10-11 08:00:01
【问题描述】:

我正在对来自不同数据库的同一张表进行union,以获取所有公司详细信息。如下所示。

CREATE PROCEDURE [dbo].[getCompanyDetails]
    (@Companycode varchar(2))
AS
BEGIN
    SELECT '[FirstDataBase]' DBNAME, CompanyID, CompanyName 
    FROM [FirstDataBase].dbo.tblCompany 
    WHERE CompanyID LIKE @Companycode+'%'

    UNION

    SELECT '[SecondDataBase]' DBNAME, CompanyID, CompanyName 
    FROM [SecondDataBase].dbo.tblCompany 
    WHERE CompanyID LIKE @Companycode+'%'

    UNION

    SELECT '[ThirdDataBase]' DBNAME, CompanyID, CompanyName 
    FROM [ThirdDataBase].dbo.tblCompany 
    WHERE CompanyID LIKE @Companycode+'%'

    UNION

    SELECT '[FourthDataBase]' DBNAME, CompanyID, CompanyName 
    FROM [FourthDataBase].dbo.tblCompany 
    WHERE CompanyID LIKE @Companycode+'%'
END

这工作正常,我正在获取所有公司详细信息,但我想确保服务器中存在该数据库。

因为如果服务器中不存在任何一个联合数据库,则存储过程将失败。如何更改存储过程,以便即使任何联合失败,另一个也应该工作并给出结果?

PS:一个额外的问题,有什么办法可以将一个数据库与另一台服务器合并?

【问题讨论】:

    标签: sql sql-server database


    【解决方案1】:

    最简单的就是IF DB_ID('yourdb') IS NOT NULL

    有关讨论等,请参阅How to check if a database exists in SQL Server?

    将其与 select 语句一起使用的一种方法是使用动态 SQL 来构造 SQL 语句,然后运行它,例如,

    DECLARE @CustomSQLSelect nvarchar(4000)
    
    SET @CustomSQLSelect = 
        CASE WHEN DB_ID('FirstDataBase') IS NOT NULL
             THEN ' UNION Select ''[FirstDataBase]'' DBNAME,CompanyID ,CompanyName 
                  From [FirstDataBase].dbo.tblCompany Where CompanyID like ''' + @Companycode + ''' +''%'''
             ELSE '' END
        + CASE WHEN DB_ID('SecondDataBase') IS NOT NULL
             THEN ' UNION Select ''[SecondDataBase]'' DBNAME,CompanyID ,CompanyName 
                  From [SecondDataBase].dbo.tblCompany Where CompanyID like ''' + @Companycode + ''' +''%'''
             ELSE '' END
        + CASE WHEN DB_ID('ThirdDataBase') IS NOT NULL
             THEN ' UNION Select ''[ThirdDataBase]'' DBNAME,CompanyID ,CompanyName 
                  From [ThirdDataBase].dbo.tblCompany Where CompanyID like ''' + @Companycode + ''' +''%'''
             ELSE '' END
        + CASE WHEN DB_ID('FourthDataBase') IS NOT NULL
             THEN ' UNION Select ''[FourthDataBase]'' DBNAME,CompanyID ,CompanyName 
                  From [FourthDataBase].dbo.tblCompany Where CompanyID like ''' + @Companycode + ''' +''%'''
             ELSE '' END;
    
    -- You may want to put in a PRINT @CustomSQLSelect to review the SQL
    
    IF @CustomSQLSelect LIKE ' UNION %' 
        BEGIN
        
        SET @CustomSQLSelect = STUFF(@CustomSQLSelect, 1, 7, ''); -- Delete the first ' UNION ' statement
    
        EXEC (@CustomSQLSelect);
    
        END
    ELSE
        BEGIN
        PRINT 'No valid databases!'
        END;
    
    
    
    

    我想我在上面的 SQL 中得到了正确的撇号等。

    您也可以只创建一个临时表并填充它...在我看来这更容易维护。

    CREATE TABLE #Companies (
        DBName nvarchar(100), 
        CompanyId varchar(20), 
        CompanyName nvarchar(100)
        )
    -- Note - set your nvarchar/varchars appropriately
    
    IF DB_ID('FirstDatabase') IS NOT NULL
        BEGIN
        INSERT INTO #Companies (DBName, CompanyID, CompanyName)
          Select '[FirstDataBase]' DBNAME,CompanyID ,CompanyName 
          From   [FirstDataBase].dbo.tblCompany 
          Where CompanyID like @Companycode+'%'
        END
    
    -- Then do the same for other databases
    
    

    请注意,如果数据库不存在,则在 SSMS 中查看您的查询可能会显示错误。

    另请注意,UNION(而不是 UNION ALL)将有效地将“SELECT”语句更改为“SELECT DISTINCT”以停止重复。这会增加额外的处理。

    临时表版本没有。如果需要,您可以添加“DISTINCT”。

    或者,如果您对重复感到满意,或者您知道没有重复(例如,companyID 是 PK 或在每个数据库中是唯一的),则将 UNION 更改为 UNION ALL 可能会加快处理速度。

    从其他服务器读取数据 - 一种方法是使用Linked servers。我相信这些都是在服务器级别设置的。您需要进行研究,看看这是否适合您。

    【讨论】:

    • 对不起,我错过了。我已经编辑了我的答案,以展示如何使用动态 SQL 创建您的 SQL 语句。
    • ... 并添加了临时表版本,以及关于 UNION 与 UNION ALL 的注释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2012-10-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多