2011-12-29 40 views
7

Tôi có một thủ tục lưu trữ sauLàm cách nào để kết hợp các tập hợp kết quả từ hai cuộc gọi thủ tục được lưu trữ?

CREATE PROCEDURE [dbo].[MyStored] 
    @state int 
AS 
    SELECT blahblahblah WHERE [email protected] LotsOfJoinsFollow; 
RETURN 0 

và tôi muốn gọi đó là thủ tục lưu trữ với @state là 01 và có bộ kết quả được trả về bởi cả hai cuộc gọi kết hợp với UNION ngữ nghĩa vì vậy mà tôi có một new resultset có các hàng từ cả cuộc gọi đầu tiên và cuộc gọi thứ hai.

Giống như (SQL tưởng tượng):

(EXEC MyStored 0) UNION (EXEC MyStored 1); 

Làm thế nào để đạt được điều đó?

+0

Bạn có đồng ý với việc @state là danh sách được phân cách bằng dấu phẩy không? (ví dụ: state = '0,1') - giải pháp khác nhau tùy thuộc vào câu trả lời của bạn. –

+0

@Ray K: Tôi không chắc chắn, tôi thích một giải pháp dễ bảo trì hơn. – sharptooth

+2

trùng lặp: http://stackoverflow.com/questions/5292069/union-the-results-of-multiple-stored-procedures – goric

Trả lời

12

này có thể quá đơn giản hoá vấn đề, nhưng nếu bạn có kiểm soát đối với sp, chỉ cần sử dụng trong chứ không phải =:

CREATE PROCEDURE [dbo].[MyStored] 
AS 
    SELECT blahblahblah WHERE StoredState IN (0,1) LotsOfJoinsFollow; 
RETURN 0 

Nếu đây không phải là một lựa chọn, chỉ cần đẩy các kết quả của cả hai sproc gọi vào một bảng temp:

/*Create a table with the same columns that the sproc returns*/ 
CREATE TABLE #tempblahblah(blahblahblah NVARCHAR(50)) 

INSERT #tempblahblah (blahblahblah) 
EXEC MyStored 0 

INSERT #tempblahblah (blahblahblah) 
EXEC MyStored 1 

SELECT * FROM #tempblahblah
1

Một cách dài sẽ là tạo trình bao bọc thực hiện điều này - một hàm lấy danh sách các trạng thái và thêm chúng vào bảng cuối cùng sẽ được trả về.

Bạn cũng có thể có bất cứ điều gì công nghệ đang kêu gọi thủ tục này làm ghép của các hồ sơ (tức là có NET nối thêm các thiết lập kết quả của mỗi tiểu bang bạn đang tìm kiếm vào)

Nếu bạn đang sử dụng tốt với đi qua trong một danh sách của các trạng thái cho thông số 'trạng thái' của bạn, bạn có thể tạo truy vấn sql động

CREATE PROCEDURE [dbo].[MyStored] 
    @state nvarchar(150) 
AS 

-- @state needs to be pre-formatted in a list for an in-clause 
-- i.e. 1,2,10 (if it was a string list, you'd need to do use double single quotes around the items - ''1'',''2'',''10'' 

DECLARE @SQL nVarChar(5000) = ' 
    SELECT blahblahblah 
    FROM LotsOfJoins 
    WHERE StoredState in (' + @state + ')' 


exec sp_executeSql @sql 

Điều này phù hợp với quy trình đơn giản; mặc dù, có thể mất nhiều thời gian hơn để duy trì nếu cần thay đổi xuống đường.

.

Đây là một CodeProject ArticleMS SQL Tips Article mà không một công việc tốt hơn đi sâu vào chi tiết

.

EDIT: Các @state param sẽ cần phải là một nvarchar kể từ khi đi qua của bạn trong một dấu phẩy phân cách danh sách int đánh giá cao

5
create table #table ( 
    ..... 
) 

insert into #table exec MyStored 0 
insert into #table exec MyStored 1 

select * from #table 

drop table #table 
3

Ngoài ra một loạt các báo cáo như thế này:

INSERT INTO #YourTempTable 
EXEC MyStored 0; 
INSERT INTO #YourTempTable 
EXEC MyStored 1; 

bạn có thể sử dụng một trong INSERT ... EXEC tuyên bố như dưới đây:

INSERT INTO #YourTempTable 
EXEC (' 
    EXEC MyStored 0; 
    EXEC MyStored 1; 
'); 

Kết quả của hai cuộc gọi đến MyStored sẽ UNIONed (hoặc, đúng hơn , UNION ALLED), giống như với phương pháp cũ.

0

Nếu thủ tục lưu trữ bạn đang gọi có bảng tạm thời có cùng tên với một thủ tục gọi điện, bạn sẽ gặp phải lỗi này.

ví dụ:sp1 có bảng tạm thời #results

sp2 tạo bảng #results (trường) sau đó cố gắng chèn vào #results in sp2 kết quả của việc gọi sp1 sẽ không thành công với lỗi này. thay đổi bảng tạm thời trong sp2 thành #result và thử lại và bạn sẽ thấy điều này hiện hoạt động.

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