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

时间:2013-12-09 17:11:37

标签: sql sql-server database

给出带有sql server的不同机器。他们都有相同的数据库。这些数据库之间的唯一区别是他们的名字。它可以是两个名字,比如'DB1'和'DB2'。

我需要检查,在给定的机器上使用哪个名称并在其上创建一个函数。该功能非常大,至少有50个需要DB名称的位置。

我试图做像

这样的事情
DECLARE @dbName VARCHAR(20)
SET @dbName = ISNULL(DB_ID('DB1'), 'DB2');

SELECT * FROM @dbName.dbo.testtable;

但它不起作用。 任何帮助将不胜感激。

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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

答案 2 :(得分: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;

答案 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