Hãy thử điều này:
SELECT *
FROM OPENQUERY("FOO\SQL2012", 'SET FMTONLY OFF; EXEC mySchema.myStoredProc;') X;
Lý do cho điều này là khi bạn thực thi một thủ tục được lưu trữ trên một máy chủ được liên kết, trước tiên nhà cung cấp sẽ cố gắng xác định hình dạng của tập hàng kết quả. Nó thực hiện điều này bằng cách phát hành SET FMTONLY ON;
và sau đó chạy câu lệnh của bạn. Trong một thủ tục được lưu trữ không sử dụng bảng tạm thời, điều này hoạt động rất tốt. Về cơ bản, trình phân tích cú pháp truy vấn chạy nhanh mà không thực sự tìm nạp tất cả dữ liệu, chỉ siêu dữ liệu (giống như hiển thị một kế hoạch thực thi ước tính).
Vấn đề là khi thủ tục được lưu trữ does sử dụng bảng tạm thời, nó không thành công, vì siêu dữ liệu của bảng tạm thời không tồn tại:nó không thể được thu thập thông qua phân tích tổng hợp hoạt động cho các thủ tục được lưu trữ không sử dụng bảng tạm thời. Khi đó, cách chữa là SET FMTONLY OFF;
theo cách thủ công trong lô đang thực hiện quy trình được lưu trữ.
Lưu ý rằng việc sử dụng phương pháp này sẽ làm cho quy trình được lưu trữ chạy hai lần . Lần đầu tiên để thu thập siêu dữ liệu (dữ liệu đang bị loại bỏ) và lần thứ hai để thực sự trả lại dữ liệu. Nếu quy trình được gọi là lưu trữ đặc biệt tốn kém hoặc có tác dụng phụ, bạn có thể cần phải giảm trừ.
Cuối cùng, lưu ý rằng thủ thuật này không hoạt động trên mọi quy trình được lưu trữ. Có những thứ mà các thủ tục được lưu trữ có thể làm mà chỉ cần ném một cái cờ lê vào công việc. Tôi không biết tất cả các khả năng, nhưng một trong số đó là trả về nhiều tập bản ghi.
Đáp lại bản cập nhật của bạn rằng SET FMTONLY OFF
không hoạt động:bạn có thể cấu trúc lại SP của mình để không sử dụng bảng tạm thời hoặc sử dụng bảng vĩnh viễn có khóa phiên không? Một trong hai tùy chọn này có thể thực hiện công việc. Trong SQL Server 2012, bạn cũng có tùy chọn chuyển xung quanh dữ liệu bằng table- tham số có giá trị
.
Bạn có thể muốn đọc Cách chia sẻ dữ liệu giữa các thủ tục được lưu trữ của Erland Sommarskog vì nó có thể cung cấp cho bạn nguồn cảm hứng để tìm cách đạt được mục đích của mình.