2010-03-24 23 views
9

Tôi đang chạy các tuyên bố sau để xem những gì các truy vấn đang thực hiện trong máy chủ sql:Làm thế nào để có được giá trị tham số cho dm_exec_sql_text

select * 
from sys.dm_exec_requests r 
cross apply sys.dm_exec_sql_text(r.sql_handle) 
where r.database_id = DB_ID('<dbname>') 

Văn bản sql mà trở lại là tham số:

(@Parm0 int) select * from foo where foo_id = @Parm0 

Có cách nào để có được các giá trị cho các tham số mà câu lệnh đang sử dụng không? Nói bằng cách tham gia bàn khác có lẽ?

+0

Một ít công việc để làm nó theo cách đó, nhưng nó hoạt động nếu tôi phải có nó. Cảm ơn! –

+1

Bạn đã bao giờ khám phá ra một giải pháp cho điều này? Câu trả lời được chấp nhận dường như không hoạt động ... –

Trả lời

4

Chỉnh sửa: Remus là chính xác, điều này sẽ chỉ đưa ra các phiên bản được biên dịch vào lần đầu tiên kế hoạch truy vấn truy cập bộ nhớ cache, không chạy tiếp theo.

Bạn sẽ có thể nhận được các tham số từ kế hoạch truy vấn vì nó chứa các thông số cuối cùng được sử dụng. Thay đổi mã của bạn:

select * 
from sys.dm_exec_requests r 
cross apply sys.dm_exec_query_plan(plan_handle) as qp 
cross apply sys.dm_exec_sql_text(r.sql_handle) 
where r.database_id = DB_ID('<dbname>') 

Bạn sẽ tìm thấy những cột cuối cùng của kế hoạch truy vấn là query_plan, một phiên bản xml của kế hoạch truy vấn mà bạn có thể tự kiểm tra, ở dưới cùng của XML là các thông số, hoặc nếu bạn ưa thích thử thách sử dụng phân tích cú pháp XML và XQuery để kéo ra các thẻ ParameterList

+4

Tôi nghĩ rằng đó là các thông số được đánh hơi trong quá trình tạo kế hoạch, không phải là thông số cuối cùng được sử dụng. –

+0

Quyền của bạn, điều đó làm cho điều này trở thành một con ngựa cái vì tôi không thấy DMV nào khác cung cấp một bản ghi về những gì tham số đơn giản/bắt buộc đã thực hiện đối với câu lệnh – Andrew

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