Tôi đang tìm kiếm bất kỳ ví dụ nào mà việc sử dụng con trỏ là không thể tránh khỏi. Tôi khá chắc chắn có một số trường hợp hiếm hoi như vậy, nhưng tôi không thể đưa ra bất kỳ kịch bản nào. Bất kỳ trợ giúp sẽ là tuyệt vời. Cảm ơn!
Tôi đang tìm kiếm bất kỳ ví dụ nào mà việc sử dụng con trỏ là không thể tránh khỏi. Tôi khá chắc chắn có một số trường hợp hiếm hoi như vậy, nhưng tôi không thể đưa ra bất kỳ kịch bản nào. Bất kỳ trợ giúp sẽ là tuyệt vời. Cảm ơn!
Câu trả lời:
Chắc chắn (và giả sử rằng một vòng lặp while và một con trỏ về cơ bản là giống nhau cho mục đích thảo luận, loại bỏ bất kỳ đối số nào sử dụng vòng lặp while để tránh một con trỏ, điều này đơn giản là không đúng ngoại trừ theo cách mô phạm nhất)
Ngoài ra còn có một số hoạt động siêu dữ liệu mà bạn có thể muốn sử dụng một con trỏ, ví dụ: để vô hiệu hóa và kích hoạt lại tất cả các ràng buộc khóa ngoài trên mỗi bảng. Cá nhân, tôi luôn thích xây dựng một chuỗi trong một truy vấn mà tôi có thể thực hiện cùng một lúc, nhưng bạn có thể không muốn làm điều này vì nhiều lý do. Ví dụ, tôi đã không sử dụng một con trỏ trong câu trả lời này, mặc dù tôi có thể có và nó sẽ đơn giản hơn để viết . (Cũng lưu ý rằng các giải pháp như thế - và nhiều truy vấn dường như được thiết lập - về mặt kỹ thuật vẫn sử dụng một con trỏ dưới bìa - bạn thực sự không viết DECLARE CURSOR...)
Cũng có thể khá phức tạp để xây dựng một truy vấn dựa trên tập hợp thực hiện chính xác những gì con trỏ làm và thường không đáng để đầu tư thời gian hoặc tác động đến khả năng duy trì trong tương lai do độ phức tạp của truy vấn, khi con trỏ thực sự đơn giản hơn nhiều ( ngay cả khi nó kém hiệu quả hơn). Và để hiệu quả, nếu bạn so sánh giải pháp con trỏ với giải pháp dựa trên tập hợp, hãy đảm bảo bạn sử dụng các tùy chọn con trỏ hiệu quả nhất - những điều này có thể tạo ra sự khác biệt lớn .
Đối với các truy vấn bình thường mà bạn xây dựng từ đầu và không có bất kỳ ràng buộc nào trong số này, tôi không biết rằng có một tình huống bạn phải sử dụng một con trỏ, đặc biệt là khi SQL Server tiếp tục thêm các chức năng cửa sổ và các tính năng khác hỗ trợ thêm lập trình dựa trên tập nâng cao thường được sử dụng để yêu cầu con trỏ.
Nếu bạn đang viết một con trỏ, bạn nên tự hỏi: "Có cách nào dựa trên tập hợp để làm việc này không?" Tùy thuộc vào mục đích của mã, nó sẽ được sử dụng lại bao nhiêu, cho dù đó là nhiệm vụ một lần, v.v ... câu trả lời hầu như luôn luôn là, đơn phương, "Có!" Nhưng một câu trả lời hoàn toàn hợp lệ cho câu hỏi đó cũng có thể là "Có, nhưng ai quan tâm?"
Liệu một ví dụ trong đó một con trỏ thực sự là giải pháp tốt nhất, được hỗ trợ, được ghi lại và được bảo đảm cho một vấn đề đủ? Một ví dụ như vậy là tính toán tổng số chạy trong SQL Server <2012. Tôi đã viết blog về nó ở đây - và thực sự đã chứng minh rằng trong trường hợp sử dụng của tôi, một con trỏ nhanh hơn tất cả các cách tiếp cận phổ biến khác, ngay cả cách thường được đề xuất (nhưng không được bảo đảm, được ghi lại hoặc hỗ trợ ) Phương pháp "cập nhật kỳ quặc". (Chỉ khi LAGtính năng mới 2012 không phải là một tùy chọn, trong trường hợp đó, nó sẽ chạy vòng tròn xung quanh mọi thứ khác).