sql - 如何检查服务器上是否存在给定的数据库?
问题描述
我正在做一个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:一个额外的问题,有什么办法可以将一个数据库与另一台服务器联合起来?
解决方案
最简单的是IF DB_ID('yourdb') IS NOT NULL
有关讨论等,请参阅如何检查 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 可能会加快处理速度。
从其他服务器读取数据 - 一种方法是使用链接服务器。我相信这些都是在服务器级别设置的。您需要进行研究,看看这是否适合您。
推荐阅读
- swift - 使用 to 和 from 日期过滤数组
- sql - How to use dynamic table in nested for loop in oracle pl sql
- reactjs - Multiple React Apps in a single LoadBalancer on GKE
- javascript - How to call a function from a seperate file and controller in angular js ? is it possible?
- python - 为什么我不能卷曲并在我的 Jupyter 笔记本中播放 .wav 文件?
- java - Saving a Dictionary to .txt file in Scala
- python - 如何在不使用装饰器的情况下运行一次函数?
- javascript - 传单总是在点击事件后居中地图
- java - Mockito 可以捕获实现中声明的变量的参数吗?
- reactjs - React Jest/React-testing-Library 路由更改无法正常工作