1

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

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

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

4

3 回答 3

5

您可以使用参数并检查 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
于 2013-03-25T19:07:46.670 回答
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 是您创建链接服务器时的名称。

于 2013-03-25T19:16:49.440 回答
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 在 database1 中,其他用户在 database2 中:

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
于 2013-03-25T19:15:45.127 回答