2010-10-06 41 views
11

Tôi cần một SP để trả về nhiều bộ kết quả. Tập kết quả thứ hai sẽ dựa trên một cột của tập kết quả đầu tiên.Thủ tục lưu trữ trả về nhiều bộ kết quả

Vì vậy:

declare @myTable1 table(field0 int,field1 varchar(255)) 
insert into @myTable1 select top 1 field0, field1 from table1 

declare @myTable2 table(field0 int,field3 varchar(255)) 
insert into @myTable2 
select field0, field3 from table2 
where @myTable1.field0 = @myTable2.field0 

Làm thế nào để trở lại @ myTable1 và @ myTable2 với SP của tôi? Cú pháp này có đúng ngay cả không?

lời xin lỗi của tôi, tôi vẫn là một newbie tại SQL ...

EDIT:

Vì vậy, tôi nhận được một lỗi trên dòng cuối cùng của mã bên dưới cho biết: " phải khai báo các biến vô hướng "@ myTable1""

declare @myTable1 table(field0 int,field1 dateTime) 
insert into @myTable1 
select top 1 field0, field1 
from someTable1 m 
where m.field4 > 6/29/2009 

select * from @myTable1 
select * 
from someTable2 m2 
where m2.field0 = @myTable1.field0 

Nếu tôi làm nổi bật và chạy mã cho đến thứ hai select * nó hoạt động tốt ... khi tôi làm nổi bật phần còn lại nó hoạt động như các biến đầu tiên không tồn tại ...

EDIT2: Đã giải quyết được vấn đề đó. Cảm ơn các bạn.

declare @myTable1 table(field0 int,field1 dateTime) 
insert into @myTable1 
select top 1 field0, field1 
from someTable1 m 
where m.field4 > 6/29/2009 

select * from @myTable1 
select * 
from someTable2 m2 
where m2.field0 = (select field0 from @myTable1) 
+0

Đã hỏi trước, nhưng bạn đang sử dụng RDBMS nào? – JNK

+0

Nó sẽ không hoạt động nếu bạn không có DECLARE @ Mytable1 trong cùng một tuyên bố. Nếu bạn chỉ làm nổi bật phần cuối cùng, thì DECLARE không có trong truy vấn đó. các biến này chỉ tốt cho một truy vấn và không tồn tại. – JNK

+0

Microsoft SQL Server 2005 – EJC

Trả lời

20

Bạn khá nhiều chỉ cần chọn hai kết quả đặt

SELECT * FROM @myTable1 
SELECT * FROM @myTable2 

Tuy nhiên, một số công cụ sẽ ẩn một số kết quả (ví dụ pgAdmin sẽ chỉ hiển thị cuối cùng) và một số công cụ có một số loại yêu cầu để có được kết quả tiếp theo thiết lập (ví dụ: IDataReader của .NET sẽ không cho phép bạn Read() từ kết quả thứ hai cho đến khi bạn gọi NextResult()).

Edit:

Một thay thế trong trường hợp này, vì các loại trận đấu hai kết quả, là để kết hợp chúng thành một resultset duy nhất:

SELECT field0, field1 from @myTable1 
UNION 
SELECT field0, field3 from @myTable2 

Bạn cũng có thể lựa chọn giữa UNION ALL hoặc UNION DISTINCT (mặc định) ở vị trí thứ hai sẽ chỉ gửi các hàng không lặp lại.

+0

Điểm tốt! Tôi đã không giải quyết điều này kể từ khi ông đã không đề cập đến các ứng dụng gọi điện thoại. – JNK

+0

@JNK, lol đó chính xác là lý do tôi * đề cập đến nó, tự hỏi tại sao họ lại gặp khó khăn khi thử nó, tôi tự hỏi liệu có lẽ họ đã làm tốt, nhưng công cụ của họ đang giấu nó. –

+0

Kết quả của truy vấn này sẽ được gửi qua email ở định dạng HTML từ ứng dụng C# ... Cách tiếp cận này sẽ vẫn hoạt động? Tôi đã không nhìn quá sâu vào các ứng dụng gọi SP, tôi chỉ biết nó có thể gọi một SP để có được một số kết quả và sau đó một chương trình khác sẽ gửi email kết quả .. – EJC

4

Vào cuối của Proc lưu trữ, đưa:

SELECT * FROM @myTable1 
SELECT * FROM @myTable2 

này sẽ trở lại 2 bộ kết quả.

+0

Tuyệt vời Tôi sẽ thử điều này ngay :) – EJC

+0

Ghi nhớ rằng bạn sẽ thực sự nhận được BA bộ kết quả, vì có vẻ như bạn có một từ lựa chọn ở cuối mã của bạn trong OP. – JNK

+0

Điều này không hoạt động ... Tôi nhận được thông báo lỗi ", phải khai báo biến vô hướng @ myTable1" khi thực hiện mệnh đề where "where @ myTable1.field0 = @ myTable2.field0" bất kỳ suy nghĩ nào? – EJC

Các vấn đề liên quan