2010-04-01 64 views
18

Làm cách nào để kết hợp thực hiện thủ tục được lưu trữ và sử dụng kết quả hoặc tham số của nó trong truy vấn SQL thông thường?Kết hợp thủ tục và truy vấn được lưu trữ trong T-SQL

Ví dụ tôi muốn làm một cái gì đó như sau:

-- passing result of SELECT to SP 
SELECT a, b FROM t 
EXEC my_sp a, b 

-- passing result of SP to INSERT  
INSERT INTO t 
EXEC my_sp a, b 

, vv

+0

Bạn có thể viết lại câu hỏi của mình không? Nó không có ý nghĩa nhiều trong hình thức hiện tại của nó. – JohnFx

+0

@JohnFx: Tôi đang hỏi về tất cả các kết hợp có thể có của SP và DML. Tại sao nó không có ý nghĩa? – abatishchev

+0

Không có hành vi phạm tội, tôi chỉ nghĩ rằng ý nghĩa của câu hỏi của bạn là bị mất trong bản dịch hơi kém sang tiếng Anh. – JohnFx

Trả lời

24

không, bạn cần phải sử dụng một bảng temp

create table #results (col1 int, col2 varchar(5) ...) 

INSERT INTO #results 
    EXEC YourProcedure @parma... 

sau đó bạn có thể tham gia vào it

SELECT 
    * 
    FROM YourTable  y 
     JOIN #results r ON ... 
    .... 

nếu bạn không biết các cột và kiểu dữ liệu từ quy trình, bạn có thể sử dụng câu trả lời tuyệt vời này: Insert results of a stored procedure into a temporary table

Tóm tắt, sử dụng OPENROWSET để thực hiện quy trình được lưu trữ thành bảng #temp được tạo mà không cần sự cần thiết phải đặt tên và biết loại tất cả các cột.

4

Nếu SP của bạn có thể được viết lại dưới dạng bảng nội tuyến có giá trị UDF, chúng thường hoạt động rất tốt và tương đương với chế độ xem được tham số. ITVF có thể được sử dụng bất kỳ nơi nào bạn sẽ sử dụng một bảng hoặc xem.

Nếu SP của bạn không hoạt động như một TVF nội tuyến (yêu cầu thao tác biến cục bộ), nó có thể hoạt động như một TVF nhiều câu lệnh (có chứa BEGIN/END) có thể hoặc không hoạt động kém tùy thuộc vào những gì bạn có làm.

Sau khi SP của bạn đã được chuyển thành UDF, bạn vẫn có thể gọi UDF từ SP (SELECT * FROM udf (params)) hoặc ở nơi khác nó có thể được sử dụng để tham gia, v.v. UDF - không trùng lặp.

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