Tôi có hai thủ tục được lưu trữ, một trong số đó trả về một danh sách các khoản thanh toán, trong khi phương thức kia trả về một bản tóm tắt các khoản thanh toán đó, được nhóm theo đơn vị tiền tệ. Ngay bây giờ, tôi có một truy vấn trùng lặp: truy vấn chính của thủ tục được lưu trữ trả về danh sách các khoản thanh toán là truy vấn phụ của thủ tục được lưu trữ trả về tóm tắt thanh toán bằng tiền tệ. Tôi muốn loại bỏ sự trùng lặp này bằng cách thực hiện thủ tục được lưu trữ trả về danh sách thanh toán truy vấn con của thủ tục được lưu trữ trả về tóm tắt thanh toán bằng tiền tệ. Điều đó có thể thực hiện được trong SQL Server 2008 không?Có thể sử dụng Thủ tục được lưu trữ làm truy vấn con trong SQL Server 2008 không?
Trả lời
Bạn nên chuyển đổi proc đầu tiên thành hàm TABLE-VALUED. Nếu nó liên quan đến nhiều câu lệnh, trước tiên bạn cần xác định cấu trúc bảng trả về và điền vào nó.
mẫu:
CREATE proc getRecords @t char(1)
as
set nocouut on;
-- other statements --
-- final select
select * from master..spt_values where type = @t
GO
- trở thành -
CREATE FUNCTION fn_getRecords(@t char(1))
returns @output table(
name sysname,
number int,
type char(1),
low int,
high int,
status int) as
begin
-- other statements --
-- final select
insert @output
select * from master..spt_values where type = @t
return
end;
Tuy nhiên, nếu đó là một lựa chọn thẳng (hoặc có thể được viết như một tuyên bố đơn), sau đó bạn có thể sử dụng INLINE dạng tvf, được tối ưu hóa cao
CREATE FUNCTION fn2_getRecords(@t char(1))
returns table as return
-- **NO** other statements; single statement table --
select * from master..spt_values where type = @t
proc thứ hai chỉ đơn giản là chọn từ proc đầu tiên
create proc getRecordsByStatus @t char(1)
as
select status, COUNT(*) CountRows from dbo.fn2_getRecords(@t)
group by status
Và nơi mà bạn sử dụng để gọi
EXEC firstProc @param
để có được một kết quả, bây giờ bạn chọn từ nó
SELECT * FROM firstProc(@param)
Bạn có thể nắm bắt đầu ra từ một thủ tục được lưu trữ trong bảng tạm thời và sau đó sử dụng bảng trong truy vấn chính của bạn.
Ghi lại đầu ra của thủ tục được lưu trữ trả về cột ID và Tên thành biến bảng.
declare @T table (ID int, Name nvarchar(50))
insert into @T
exec StoredProcedure
Xin lỗi ... Bạn đã nói tạm thời *** FILE ***? Trong khi đó là một giải pháp khả thi về mặt kỹ thuật, tôi không nghĩ rằng tôi có thể đủ khả năng viết và xóa các tệp tạm thời khổng lồ. – pyon
Bảng tạm thời, nó đã được sửa chữa trong câu trả lời nhưng chỉ muốn làm rõ cho độc giả trong tương lai có thể bị nhầm lẫn bởi các bình luận ở trên là lỗi thời. – Remi
Nếu bạn thực hiện thủ tục trả về danh sách vào hàm có giá trị bảng, thì tôi tin bạn có thể sử dụng nó trong truy vấn phụ.
Chèn kết quả của proc đã lưu vào bảng biến hoặc bảng tạm thời sẽ thực hiện thủ thuật.
Nếu bạn đang cố gắng sử dụng lại mã trong SQL Server từ truy vấn này sang truy vấn tiếp theo, bạn sẽ linh hoạt hơn với các hàm bảng. Lượt xem là tất cả các quyền nếu bạn không cần phải vượt qua các tham số hoặc sử dụng bất kỳ loại logic điều khiển luồng nào. Đây có thể được sử dụng như bảng trong bất kỳ chức năng khác, thủ tục, xem hoặc t-sql tuyên bố.
Tôi đồng ý với Jeff. Bảng giá trị chức năng là rất tốt cho loại điều này. – brian
Tôi sẽ sử dụng một cái nhìn, trừ khi nó cần phải được tham số, trong trường hợp này, tôi sẽ sử dụng hàm có giá trị bảng nội tuyến nếu có thể, trừ khi nó cần phải là thao tác đa câu lệnh, nơi bạn vẫn có thể sử dụng hàm có giá trị bảng, nhưng chúng thường kém hiệu quả hơn.
Tôi cần tham số để thực hiện cả hai truy vấn. Đây là lý do tại sao tôi đang sử dụng thủ tục được lưu trữ. – pyon
@Eduardo Leon Tôi sẽ sử dụng một hàm bảng có giá trị nội tuyến nếu có thể. Chúng thực sự tương đương với các khung nhìn được tham số hóa về cách trình tối ưu hóa có thể xử lý chúng và kết hợp chúng với bất kỳ khung nhìn cơ bản nào và bất kỳ mã nào đang gọi ITVF. –
Bạn có thể gọi ITVF trong mệnh đề 'FROM' của truy vấn không? – pyon
- 1. Làm cách nào để lưu một thủ tục được lưu trữ trong SQL Server 2008 R2?
- 2. SELECT đối với thủ tục được lưu trữ SQL Server
- 3. Tôi muốn ẩn tập lệnh của một thủ tục được lưu trữ trong SQL Server 2008
- 4. Nơi tìm thủ tục lưu trữ msdb.dbo.sp_send_dbmail trong SQL Server
- 5. Cách giải mã thủ tục được lưu trữ trong SQL Server 2008
- 6. Thủ tục lưu trữ SQL Server Thư mục/nhóm
- 7. Microsoft SQL Server - Ai đã tạo thủ tục lưu trữ?
- 8. Gọi thủ tục lưu trữ từ một thủ tục lưu trữ SQL Server
- 9. Tham số thủ tục lưu trữ SQL Server
- 10. Các truy vấn tạo ra LINQ có được lưu trữ hiệu quả bởi SQL Server 2008 không?
- 11. Kết hợp thủ tục và truy vấn được lưu trữ trong T-SQL
- 12. Truy vấn tham số KHÔNG CÓ thủ tục được lưu trữ?
- 13. Truy vấn chậm liên tục trên SQL Server 2008
- 14. Thủ tục lưu trữ SQL Server để gửi email
- 15. SQL Server lưu trữ mã thủ tục được lưu trữ ở đâu?
- 16. Nhiều truy vấn VS Thủ tục lưu trữ
- 17. Là một thủ tục được lưu trữ được gọi là đệ quy có thể có trong SQL Server?
- 18. Có công cụ miễn phí nào có thể giúp hình dung logic của một thủ tục được lưu trữ trong SQL Server 2008 R2 không?
- 19. Làm thế nào tôi có thể lấy danh sách tham số từ thủ tục được lưu trữ trong SQL Server
- 20. Bạn có nên lưu trữ các thủ tục lưu trữ SQL trong Kiểm soát nguồn không?
- 21. Làm cách nào để tạo điều kiện thủ tục được lưu trữ trong SQL Server?
- 22. UNION có điều kiện trong thủ tục được lưu trữ
- 23. trường hợp trong thủ tục được lưu trữ sql trên SQL Server
- 24. Truy cập vào tập kết quả từ trong các thủ tục được lưu trữ Transact-SQL SQL Server
- 25. SQL - Thủ tục được lưu trữ với Chọn Tuyên bố bằng cách sử dụng IN (@Variable_CommaDelimitedListOfIDS)
- 26. Lưu trữ SQL Server Thủ tục lưu giữ giá trị trả về trong T-SQL
- 27. Làm cách nào để thực thi thủ tục được lưu trữ trong tác vụ SQL Agent?
- 28. Gọi thủ tục lưu trữ trong một thủ tục được lưu trữ trong MySQL
- 29. Truy vấn Tab Sql Server 2008
- 30. Không thể tìm thấy thủ tục được lưu trữ, tuy nhiên có thể thực hiện nó
Điều gì sẽ xảy ra khi thủ tục lưu trữ của bạn cần chạy OPENQUERY trên CUBE? Bạn không thể làm điều đó từ bên trong một hàm. –