给出带有sql server的不同机器。他们都有相同的数据库。这些数据库之间的唯一区别是他们的名字。它可以是两个名字,比如'DB1'和'DB2'。
我需要检查,在给定的机器上使用哪个名称并在其上创建一个函数。该功能非常大,至少有50个需要DB名称的位置。
我试图做像
这样的事情DECLARE @dbName VARCHAR(20)
SET @dbName = ISNULL(DB_ID('DB1'), 'DB2');
SELECT * FROM @dbName.dbo.testtable;
但它不起作用。 任何帮助将不胜感激。
答案 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