如何检查数据库是否存在并在函数中使用它?

3

给定带有SQL Server的不同机器。它们都有相同的数据库。这些数据库之间唯一的区别是它们的名称。可能会有两个名称,比如‘DB1’和‘DB2’。

我需要检查在给定的机器上使用的是哪个名称并创建一个函数。该函数非常庞大,至少需要50个位置需要使用数据库名称。

我尝试做类似于下面的事情

DECLARE @dbName VARCHAR(20)
SET @dbName = ISNULL(DB_ID('DB1'), 'DB2');

SELECT * FROM @dbName.dbo.testtable;

但它无法正常工作。非常感谢您的帮助。

你事先知道数据库的名称吗,还是它们可能是可变的? - Paul Williams
@Paul Williams。我知道。它只能是DB1或DB2,没有其他可能性。 - Dzmitry Sevkovich
4个回答

3

不行,那样做行不通。只有两个可能的数据库,您最好使用 if

DECLARE @dbName VARCHAR(20)
SET @dbName = CASE WHEN DB_ID('DB1') IS NULL THEN 'DB2' ELSE 'DB1' END;

IF @dbName = 'DB1' 
    SELECT * FROM DB1.dbo.testtable;
ELSE
    SELECT * FROM DB2.dbo.testtable;

如果您想要在该范围内运行所有未来的查询,并且针对该数据库动态运行 USE 语句:

IF @dbName = 'DB1' 
    USE DB1;
ELSE
    USE DB2;

所以基本上,如果我有100个对其中一个数据库的引用,我必须为每个引用使用那个if-else语句。正确吗? - Dzmitry Sevkovich
@DzmitrySevkovich 如果所有查询都在同一作用域中,则可以使用USE语句更改数据库 - 请参阅我的编辑。 - D Stanley
@D Stanley很不幸,它给了我一个错误:在存储过程、函数或触发器中不允许使用USE数据库语句。 - Dzmitry Sevkovich
你能在运行存储过程之前选择数据库吗?然后该存储过程应使用所选的数据库运行。 - D Stanley

2

您可以使用动态SQL:

DECLARE @dbName VARCHAR(20)
SET @dbName = 'DB2'

IF DB_ID('DB1') IS NOT NULL
    SET @dbName = 'DB1'

DECLARE @SQL NVARCHAR(100)
SET @SQL = N'SELECT * FROM ' + @dbName + N'.dbo.testtable'

EXEC sp_executesql @SQL

1
您可以尝试使用DB_ID函数,类似这样的方式:

IF DB_ID('DB1') IS NOT NULL
PRINT 'exists'

尝试像这样:

试试这样做:

DECLARE @db VARCHAR(20)
SET @db = CASE WHEN DB_ID('DB1') IS NULL 
          THEN 'DB2' 
          ELSE 'DB1'
          END;

IF @db = 'DB1' 
    SELECT * FROM DB1.dbo.testtable;
ELSE
    SELECT * FROM DB2.dbo.testtable;

我确实使用过它。但我不仅需要检查它是否存在,而且我想使用现有数据库的名称。 - Dzmitry Sevkovich
@DzmitrySevkovich:我已经更新了我的答案。希望有所帮助! - Rahul Tripathi
1
如果DB1不存在,ISNULL(DB_ID('DB1'), 'DB2')将尝试将字符串DB2转换为整数。 - Martin Smith
@RahulTripathi:如果您尝试运行该查询,将会出现错误“将varchar值'DB2'转换为数据类型smallint时转换失败。” - Paul Williams
@RahulTripathi - 最明显的解决方法已经在D Stanley的答案中提到了。 - Martin Smith
显示剩余3条评论

0
DECLARE @dbName NVARCHAR(128);
DECLARE @Sql NVARCHAR(MAX);
SET @dbName = 'DataBaseName'


IF db_id(@dbName) is not null

   BEGIN    
       SET @Sql = N'SELECT * FROM ' + QUOTENAME(@dbName) + N'.[dbo].[TableName]'   
   END

ELSE

  BEGIN
    SET @Sql = N'SELECT * FROM ' + QUOTENAME(db2Name) + N'.[dbo].[TableName]'
  END 

EXECUTE sp_Executesql @Sql

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接