使用存储过程对两个数据库执行查询,以便在下拉列表中返回两组数据

时间:2014-09-07 13:34:20

标签: sql sql-server tsql stored-procedures

我在表单上有两个下拉菜单。第二个下拉列表根据第一个下拉列表中选择的值填充。两个存储过程查询之一我基本上显示的数据,其中@LocID的值不匹配在第一个下拉列表中不存在,并且还执行子查询,其中没有返回与声明的@LocID匹配的任何内容的zipcodes。

DECLARE @LocID INT;

SELECT
 DISTINCT l.[ZipCode],
 [Description] = l.ZipCode + ' - ' + l.Description
FROM LocMap l
  WHERE l.ZipCode NOT IN (
  SELECT l2.ZipCode
  FROM LocMap l2
  WHERE l2.LocID = @LocID
);

表名为LocMap。

LocID | ZipCode | Description
----------------------------------
100  | 91012   | Magical Sky
100  | 91013   | Dream Land
101  | 91012   | Blue Ocean
102  | 91012   | Gray Screen
104  | 91014   | Limit Break
108  | 91016   | Magic Hammer

我的问题是我的第二个存储过程,它也将数据返回到标记为最近添加的第二个下拉列表。它基本上查询一个表并返回它的所有数据(ZipCode +描述),没有标准或任何东西。我想知道的是,是否有可能在同一台服务器上查询两个数据库,如果是这样,我将如何对上面的存储过程执行相同的数据过滤以及第二个表的存储过程查询。第一个存储过程具有@declare LocID,但是第二个存储过程所做的只是返回所有内容而不声明任何内容。

1)建议的方法是什么。是否可以从第一个存储过程获取结果并执行类似于使用RecentAdded筛选出我的数据的子查询?就像第一个查询一样,我也不想返回任何与第二个表结果上传递的LocID相匹配的zipcode。

名为RecentAdded

的第二个存储过程表
ZipCode | Description
----------------------------------
91018   | Zelda
91019   | Sephiroth
91012   | Cloud
91012   | Aeris
91011   | Tifa
91010   | Barrett

Dropdown Layout Example

[Select LocID] (First Dropdown)
   100
   104
   108
   120

[Select ZipCode - Description] (Second Dropdown]
  ---Recently Added---
    91010 - Barrett
    91018 - Zelda
    ......................
    ......................
    ......................
  ---All other ZipCodes---
    91016 - Magic Hammer
    91014 - Limit Break
    ......................
    ......................
    ......................

2 个答案:

答案 0 :(得分:1)

您可以使用UNION运算符一次性执行此操作:

DECLARE @LocID INT;

SELECT DISTINCT
    f.[ZipCode],
    [Description] = f.ZipCode + ' - ' + f.Description,
    f.[RecentlyAdded]
FROM (
    SELECT
        l.[ZipCode],
        l.[Description],
        RecentlyAdded = CAST(0 AS BIT)
    FROM LocMap l
    UNION
    SELECT
        r.[ZipCode],
        r.[Description],
        RecentlyAdded = CAST(1 AS BIT)
    FROM RecentlyAdded r
) f
WHERE f.ZipCode NOT IN (
    SELECT l2.ZipCode
    FROM LocMap l2
    WHERE l2.LocID = @LocID
)
ORDER BY RecentlyAdded DESC;

从两个表中获取输入后,您可以将结果存储为自己的“表”,并进行过滤/选择,就像您只查询一个表一样。

确保正确更改上面的RecentAdded的数据库/模式名称(在帖子中没有看到)。

SQL Fiddle

答案 1 :(得分:0)

使用临时表存储中间值,如下所示。根据具体情况,真正的夯实表(如图所示)或表值变量可能是合适的。

create table #t(
    ZipCode  varchar(7)
    ,Description varchar(255)
);
-- N.B. Don't insert a **go** here

insert #t (ZipCode,Description)
exec <second stored procedure name and parameters>;

-- proceed to join to your prior query