使用存储过程执行相同的查询两个不同的数据库

时间:2013-03-25 19:03:56

标签: sql sql-server-2008

如何使用基于变量(参数)的存储过程在同一服务器中使用两个不同的数据库执行相同的查询?

由于我使用它的方式,这必须在存储过程中完成。信息存储在两个数据库的相同表名中。我需要基于变量的结果是动态的。如果输入X变量,则需要从databaseA读取,但如果输入Y,则需要从databaseB读取。

我现在所拥有的是一个可行的查询,每次都会更改dbo。我花了很多时间寻找答案,但我找不到任何东西。任何人都可以帮助我开始吗?

3 个答案:

答案 0 :(得分:4)

您可以使用参数并检入where子句,并决定从哪个数据库表中选择数据来试试这个

--assuming both tables have same table structure
select * from database1.dbo.table where 'x' = @param1
union all
select * from database2.dbo.table where 'y' = @param1

if (@param1 = 'x') 
begin
  select * from database1.dbo.table 
end
else if (@param1 = 'y')
begin
  select * from database2.dbo.table
end

答案 1 :(得分:1)

另一个选项是动态SQL。

DECLARE @sql NVARCHAR(MAX) = N'SELECT
  col FROM [Database' 
    + CASE @param WHEN 'X' THEN 'A' ELSE 'B' END + '].dbo.table
    WHERE ...';

EXEC sp_executesql @sql;

如果你正在连接,请说:

+ ' WHERE somecol <= dateadd(DAY, 1, ' + @DATE + '))';

然后是的,你会得到一个错误(但不是你指出的错误)。很难说你的pastebin代码中的哪个位置出现错误,因为它没有任何动态SQL。但是,您应该使用强类型参数,而不是上述模式,例如

DECLARE @date DATE = '2013-03-11'; -- no m/d/y ugliness please

DECLARE @sql NVARCHAR(MAX) = N'SELECT
  col FROM [Database' 
    + CASE @param WHEN 'X' THEN 'A' ELSE 'B' END + '].dbo.table
    WHERE somecol <= dateadd(DAY, 1, @date_param))';

EXEC sp_executesql @sql, N'@date_param DATE', @date;

我更改了变量名称,以便您了解它是如何传入的。

编辑您要尝试整理的新品牌,您需要更改:

EXEC sp_executesql @SQL, N'@date_param DATE', @DATE;

要:

EXEC sp_executesql 
  @SQL, -- unparameterized command
  N'@USERID VARCHAR(100), @OURORDERDATE DATE', -- param list
  @USERID,       -- param 1
  @OURORDERDATE; -- param 2

解开更多纱线并拔出更多牙齿,假设用户X和Y在数据库1中而其他人在数据库2中,可能就在此之后:

DECLARE @sql NVARCHAR(MAX) = N'USE Database' 
  + CASE WHEN @UserID IN ('X','Y') THEN '1' ELSE '2' END
  + ';';

SELECT ...all the join stuff from your pastebin...
WHERE  (TABEL2.SOLDTOCUSTID = @USERID)
    and TABEL2.OURORDERDATE >= DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0)
    and (TABEL2.OURORDERDATE <= dateadd(day, 1, @OURORDERDATE));';

EXEC sp_executesql 
  @SQL, -- unparameterized command
  N'@USERID VARCHAR(100), @OURORDERDATE DATE', -- param list
  @USERID,       -- param 1
  @OURORDERDATE; -- param 2

答案 2 :(得分:1)

您需要的是 4部分命名约定动态构建您的查询语句。此外,如果您的数据库不在同一台服务器上,则需要链接服务器或使用 OpenRowset。

假设:您的数据库位于同一服务器上,然后在您的存储过程中,您将需要一个参数来接受数据库名称@dbname。


declare @sql varchar(max)
set @sql = 'select * from '+ @dbname + '.dbo.tablename'
exec(@sql)

如果您的数据库位于不同的服务器中,则首先创建链接服务器,然后使用链接服务器,或直接使用openrowset。在您的商店程序中,您将需要@serverName和@DBName


declare @sql varchar(max)
set @sql = 'select * from ' + @ServerName + '.' + @DBName + '.dbo.tablename'
exec(@sql)

注意:此处,@ servername是您创建链接服务器名称时的名称。