2013-11-29 14 views
14

Theo hiểu biết của tôi; những gì tôi muốn làm là không thể trong sql, nhưng nó là giá trị yêu cầu các bạn.Quy trình lưu trữ Exec vào bảng tạm thời động

Cho phép nói rằng tôi có một thủ tục được lưu trữ abc trả về cột Id và Giá trị. Thủ tục lưu trữ này chủ yếu được sử dụng bởi các bộ phận khác vì lý do chức năng và tôi sẽ chỉ sử dụng nó mỗi lần và một lần nữa để kiểm tra dữ liệu.

Vì vậy, sử dụng nó như một phần của thủ tục lưu trữ của tôi:

DECLARE @tABC TABLE 
(
    ID  INT, 
    Value DECIMAL(12,2) 
) 

INSERT INTO @tABC 
    EXEC OtherDb.DataProd.abc 

Oky vì vậy đây sẽ làm việc một cách hoàn hảo cho bây giờ, nhưng những gì nếu họ thay đổi cấu trúc của thủ tục lưu trữ của họ?

Việc thêm hoặc xóa cột khỏi quy trình được lưu trữ của chúng sẽ phá vỡ mã của tôi, vì vậy có cách làm cho mã của tôi linh hoạt hơn.

nỗ lực tuyệt vọng cuối cùng của tôi đã đi một cái gì đó như thế này:

WITH tempTable AS 
(
    EXEC OtherDb.DataProd.abc 
) 
SELECT ID, Value FROM tempTable 

Mà rõ ràng thất bại thảm hại.

+3

Đó là lý do tại sao bạn nên sử dụng các hàm có giá trị bảng hoặc biến bảng thay vì các thủ tục được lưu trữ để trả về bảng. Dù sao, OPENROWSET có thể là một giải pháp cho bạn – adrianm

+0

@adrianm Nhận xét của bạn về UDF thực sự đã giải quyết được vấn đề của tôi. Tôi không thể tin rằng tôi đã không thấy điều đó trước đây. – JAT

+0

có thể trùng lặp của [Chèn kết quả của một thủ tục được lưu trữ vào một bảng tạm thời] (http://stackoverflow.com/questions/653714/insert-results-of-a-stored-procedure-into-a-temporary-table) –

Trả lời

8
SELECT * INTO #TempTable 
FROM OPENROWSET 
('SQLNCLI','Server=(local)\SQL2008R2;Trusted_Connection=yes;', 
    'EXEC OtherDb.DataProd.abc') 

SELECT * FROM #TempTable 
+0

Việc kích hoạt OPENROWSET có phải là một nguy cơ bảo mật không? – JAT

+0

Ở một mức độ nhất định, có. Nhưng không có cách nào khác để đáp ứng yêu cầu của bạn, AFAIK – Raj

6

Chèn vào bảng tạm thời. Tôi biết điều này hoạt động trong năm 2008 và ở trên, không chắc chắn về năm 2005. cột bảng tạm thời của bạn phải phù hợp với cột Proc được lưu trữ của bạn.

create table #mytable (custid int,company varchar(50),contactname varchar(50) 
       , phone varchar(50),address1 varchar(50) 
       , address2 varchar(50),city varchar(50) 
       ,st varchar(2),zip varchar(20)) 

insert into #mytable (custid,company,contactname,phone,address1,address2,city,st,zip) 
exec dbo.sp_Node_CustomerList_wService @segid = 1 

select * from #mytable 
where custid = 5 

drop table #mytable 
+0

Câu hỏi nói "Rất tiếc vì điều này sẽ hoạt động hoàn hảo ngay bây giờ, nhưng nếu chúng thay đổi cấu trúc của quy trình được lưu trữ của chúng thì sao?" Vì vậy, đây không phải là một giải pháp tốt. – CLS

+0

Tôi đồng ý với nhận xét của: Adriaan Davel Jul 20 '16 at 9:15 Xem nhận xét của ông ở trên. –

0

nó là tốt hơn và dễ dàng sử dụng openrowset

SELECT * VÀO #tempTable TỪ OPENROWSET ('SQLNCLI', 'Server = localhost; Trusted_Connection = yes;', 'EXEC OtherDb.DataProd. abc ')

+0

Vui lòng thêm một số mô tả để trả lời. –

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