如何从SQL中的不同数据库中添加2个选择的结果?

时间:2011-01-28 02:39:50

标签: sql sql-server tsql stored-procedures

我想在存储过程中的不同数据库中的2个表中的行中求和 并返回结果。

我将传入数据库的名称,另一个将是当前的数据库。

假设该表名为PayrollLedgers,该字段为PLAmount。传入的DB名称是tbr0910。而且我想通过传入sp。

的PLEmpID来过滤这两个表

请为此提供TSQL吗? 我确实有TSQL经验,但这让我很难过。

2 个答案:

答案 0 :(得分:2)

您需要为此使用动态SQL。生成SQL语句并使用sp_executesql运行它。

CREATE proc getsomevalue
    @otherdbname sysname,
    @PLEmpID int
as
declare @sql nvarchar(4000) -- this is a short statement, max is not needed
set @sql = '
    select @result =
    (select isnull(sum(PLAmount),0) from PayrollLedgers
    where PLEmpID=@PLEmpID)
    +
    (select isnull(sum(PLAmount),0) from ['+@otherdbname+']..PayrollLedgers
    where PLEmpID=@PLEmpID)'
declare @sum float
exec sp_executesql @sql, N'@PLEmpID int,@result float output', @PLEmpID, @sum output

select @sum
GO

要使用所示的确切对象名称复制它,请在tempdb中创建它,然后使用

运行它
use tempdb
exec getsomevalue 'tbr0910', 1

创建以下对象后

create database tbr0910
GO
use tbr0910
create table PayrollLedgers(PLEmpID int, PLAmount int)
insert PayrollLedgers select 1,2
insert PayrollLedgers select 1,4
insert PayrollLedgers select 3,4
GO
use tempdb
create table PayrollLedgers(PLEmpID int, PLAmount int)
insert PayrollLedgers select 1,2
insert PayrollLedgers select 1,4
insert PayrollLedgers select 3,4

答案 1 :(得分:0)

你可以这三种方式

1)cyberkiwi提供的动态SQL方法

2)假设SQL 2005或更高版本创建Synonym,然后在需要时更改同义词(此处存在并发问题,因此您需要小心)

3)在两个数据源中的每一个上调用两个和,然后在客户端中将它们一起添加。这可能是最明智的方法,因为它通常很容易改变SQL连接字符串,但是没有回答你的问题。