Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Cách sử dụng con trỏ SQL cho các mục đích đặc biệt

Bài viết này mô tả con trỏ SQL và cách sử dụng chúng cho một số mục đích đặc biệt. Nó nêu bật tầm quan trọng của con trỏ SQL cùng với những nhược điểm của chúng.

Không phải lúc nào bạn cũng sử dụng con trỏ SQL trong lập trình cơ sở dữ liệu, nhưng sự hiểu biết về khái niệm và học cách sử dụng chúng sẽ giúp rất nhiều để hiểu cách thực hiện các tác vụ đặc biệt trong lập trình T-SQL.

Tổng quan về con trỏ SQL

Hãy để chúng tôi xem qua một số khái niệm cơ bản về con trỏ SQL nếu bạn chưa quen với chúng.

Định nghĩa đơn giản

Con trỏ SQL cung cấp quyền truy cập vào dữ liệu từng hàng một, do đó cung cấp cho bạn nhiều quyền kiểm soát hơn (từng hàng) đối với tập kết quả.

Định nghĩa Microsoft

Theo tài liệu của Microsoft, các câu lệnh Microsoft SQL Server tạo ra một tập hợp kết quả hoàn chỉnh, nhưng có những lúc kết quả được xử lý tốt nhất từng hàng một. Mở con trỏ trên tập kết quả cho phép xử lý tập kết quả từng hàng một.

T-SQL và Bộ kết quả

Vì cả định nghĩa con trỏ SQL đơn giản và Microsoft đều đề cập đến tập kết quả, chúng ta hãy cố gắng hiểu chính xác tập kết quả là gì trong ngữ cảnh lập trình cơ sở dữ liệu. Hãy để chúng tôi nhanh chóng tạo và điền bảng Sinh viên vào cơ sở dữ liệu mẫu UniversityV3 như sau:

 TẠO BẢNG [dbo]. [Student] ([StudentId] INT IDENTITY (1, 1) NOT NULL, [Name] VARCHAR (30) NULL, [Course] VARCHAR (30) NULL, [Marks] INT NULL, [ExamDate] DATETIME2 (7) NULL, CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED ([StudentId] ASC)); - (5) Điền bảng StudentSET IDENTITY_INSERT [dbo]. [Student] ONINSERT INTO [dbo]. [Student] ( [StudentId], [Name], [Course], [Marks], [ExamDate]) GIÁ TRỊ (1, N'Asif ', N'Database Management System', 80, N'2016-01-01 00:00:00 ') CHÈN VÀO [dbo]. [Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (2, N'Peter', N'Database Management System ', 85, N'2016-01-01 00:00:00 ') CHÈN VÀO [dbo]. [Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (3, N' Sam ', N'Database Management System', 85, N'2016-01-01 00:00:00 ') CHÈN VÀO [dbo]. [Student] ([StudentId], [Name], [Course], [Marks ], [Ngày thi]) VALUES (4, N'Adil ', N'Database Management System', 85, N'2016-01-01 00:00:00 ') CHÈN VÀO [dbo]. [Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (5, N'Naveed', N'Database Management System ', 90, N'2016-01-01 00:00:00 ') ĐẶT IDENTITY_INSERT [dbo]. [Sinh viên] TẮT 

Bây giờ, hãy chọn tất cả các hàng từ Sinh viên bảng:

 - Xem dữ liệu bảng Sinh viênSELECT [StudentId], [Name], [Course], [Marks], [ExamDate] FROM dbo.Student 

Đây là tập hợp kết quả được trả về do chọn tất cả các bản ghi từ Sinh viên bảng.

T-SQL và Lý thuyết tập hợp

T-SQL hoàn toàn dựa trên hai khái niệm toán học sau:

  1. Lý thuyết Đặt
  2. Logic vị từ

Lý thuyết tập hợp, như tên gọi đã chỉ ra, là một nhánh của toán học về các tập hợp cũng có thể được gọi là tập hợp của các đối tượng khác biệt xác định.

Nói tóm lại, trong lý thuyết tập hợp, chúng ta nghĩ về tổng thể các sự vật hoặc đối tượng giống như cách chúng ta nghĩ về một mặt hàng riêng lẻ.

Ví dụ:học sinh là một tập hợp tất cả các học sinh riêng biệt xác định, do đó, chúng tôi lấy tổng thể một học sinh là đủ để có được thông tin chi tiết về tất cả các học sinh trong tập hợp đó (bảng).

Vui lòng tham khảo bài viết của tôi Nghệ thuật tổng hợp dữ liệu trong SQL từ tổng hợp đơn giản đến trượt để biết thêm chi tiết.

Con trỏ và Thao tác Dựa trên Hàng

T-SQL chủ yếu được thiết kế để thực hiện các hoạt động dựa trên tập hợp, chẳng hạn như chọn tất cả các bản ghi từ bảng hoặc xóa tất cả các hàng khỏi bảng.

Nói tóm lại, T-SQL được thiết kế đặc biệt để làm việc với các bảng theo kiểu dựa trên tập hợp, có nghĩa là chúng ta nghĩ về một bảng tổng thể và bất kỳ thao tác nào như chọn, cập nhật hoặc xóa đều được áp dụng tổng thể cho bảng hoặc một số hàng đáp ứng tiêu chí.

Tuy nhiên, có những trường hợp khi các bảng cần được truy cập từng hàng hơn là một tập hợp kết quả duy nhất và đây là lúc con trỏ hoạt động.

Theo Vaidehi Pandere, đôi khi logic ứng dụng cần làm việc với một hàng tại một thời điểm thay vì tất cả các hàng cùng một lúc, giống như lặp (sử dụng các vòng lặp để lặp lại) thông qua toàn bộ tập kết quả.

Khái niệm cơ bản về con trỏ SQL với các ví dụ

Bây giờ chúng ta hãy thảo luận thêm về con trỏ SQL.

Trước hết, chúng ta hãy tìm hiểu hoặc xem xét (những người đã quen với việc sử dụng con trỏ trong T-SQL) cách sử dụng con trỏ trong T-SQL.

Sử dụng con trỏ SQL là một quy trình gồm năm bước được thể hiện như sau:

  1. Khai báo con trỏ
  2. Mở Con trỏ
  3. Tìm nạp các hàng
  4. Đóng con trỏ
  5. Con trỏ Thỏa thuận phân bổ

Bước 1:Khai báo con trỏ

Bước đầu tiên là khai báo con trỏ SQL để nó có thể được sử dụng sau này.

Con trỏ SQL có thể được khai báo như sau:

 DECLARE Cursor  for  

Bước 2:Mở con trỏ

Bước tiếp theo sau khi khai báo là mở con trỏ có nghĩa là đưa con trỏ vào tập kết quả được thể hiện như sau:

 Mở  

Bước 3:Tìm nạp hàng

Sau khi con trỏ được khai báo và mở, bước tiếp theo là bắt đầu truy xuất từng hàng từ con trỏ SQL để các hàng tìm nạp lấy hàng có sẵn tiếp theo từ con trỏ SQL:

 Tìm nạp tiếp theo từ  

Bước 4:Đóng con trỏ

Sau khi các hàng được tìm nạp từng hàng một và được thao tác theo yêu cầu, bước tiếp theo là đóng con trỏ SQL.

Việc đóng con trỏ SQL thực hiện ba tác vụ:

  1. Giải phóng tập hợp kết quả hiện do con trỏ giữ
  2. Giải phóng mọi khóa con trỏ trên các hàng bằng con trỏ
  3. Đóng con trỏ đang mở

Cú pháp đơn giản để đóng con trỏ như sau:

 Đóng  

Bước 5:Con trỏ thỏa thuận

Bước cuối cùng trong vấn đề này là phân bổ con trỏ để loại bỏ tham chiếu con trỏ.

Cú pháp như sau:

 DEALLOCATE  

Tương thích con trỏ SQL

Theo tài liệu của Microsoft, con trỏ SQL tương thích với các phiên bản sau:

  1. SQL Server 2008 trở lên các phiên bản
  2. Cơ sở dữ liệu Azure SQL

Con trỏ SQL Ví dụ 1:

Bây giờ chúng ta đã quen thuộc với các bước liên quan để triển khai con trỏ SQL, chúng ta hãy xem một ví dụ đơn giản về việc sử dụng con trỏ SQL:

 - Khai báo ví dụ về con trỏ sinh viên 1USE UniversityV3GODECLARE Student_Cursor CURSOR FOR SELECT StudentId, [Name] FROM dbo.Student; OPEN Student_CursorFETCH TIẾP THEO TỪ Student_CursorWHILE @@ FETCH_STATUS =0BEG_INFETCH TIẾP THEO TỪ Student_CursorENDCL 

Kết quả như sau:

Con trỏ SQL Ví dụ 2:

Trong ví dụ này, chúng ta sẽ sử dụng hai biến để lưu trữ dữ liệu được giữ bởi con trỏ khi nó di chuyển từ hàng này sang hàng khác để chúng ta có thể hiển thị tập kết quả từng hàng một bằng cách hiển thị các giá trị của biến.

 - Khai báo con trỏ Student với các biến ví dụ 2USE UniversityV3GODECLARE @StudentId INT, @ StudentName VARCHAR (40) - Khai báo các biến để giữ dữ liệu hàng được giữ bởi con trỏDECLARE Student_Cursor CURSOR FOR SELECT StudentId, [Name] FROM dbo.Student; OPEN Student_CursorFETCH TIẾP THEO TỪ Student_Cursor INTO @StudentId, @StudentName - Tìm nạp hàng đầu tiên và lưu trữ nó vào các biếnWHILE @@ FETCH_STATUS =0BEGINPRINT CONCAT (@StudentId, '-', @StudentName) - Hiển thị dữ liệu biến dữ liệu vào con trỏ và lưu trữ nó thành các biếnINTO @StudentId, @StudentNameENDCLOSE Student_Cursor - Đóng khóa con trỏ trên các hàngDEALLOCATE Student_Cursor - Giải phóng tham chiếu con trỏ 

Kết quả của đoạn mã SQL trên như sau:

Một người sẽ tranh luận rằng chúng ta có thể đạt được cùng một đầu ra bằng cách sử dụng tập lệnh SQL đơn giản như sau:

 - Xem id và tên sinh viên mà không cần con trỏ SQLSELECT StudentId, Name FROM dbo.Studentorder theo StudentId 

Trên thực tế, có khá nhiều tác vụ yêu cầu sử dụng con trỏ SQL mặc dù thực tế là không khuyến khích sử dụng con trỏ SQL do tác động trực tiếp của chúng lên bộ nhớ.

Lưu ý quan trọng

Xin lưu ý rằng theo Vaidehi Pandere, con trỏ là một tập hợp các con trỏ thường trú trong bộ nhớ để chúng chiếm bộ nhớ hệ thống của bạn, bộ nhớ này sẽ được sử dụng bởi các quy trình quan trọng khác; đó là lý do tại sao duyệt qua một tập hợp kết quả lớn thông qua con trỏ không bao giờ là một ý kiến ​​hay trừ khi có lý do chính đáng cho điều đó.

Sử dụng con trỏ SQL cho các mục đích đặc biệt

Chúng ta sẽ xem xét một số mục đích đặc biệt mà con trỏ SQL có thể được sử dụng.

Kiểm tra bộ nhớ máy chủ cơ sở dữ liệu

Vì con trỏ SQL có ảnh hưởng lớn đến bộ nhớ hệ thống, chúng là ứng cử viên tốt để tái tạo các tình huống sử dụng quá nhiều bộ nhớ bởi các thủ tục được lưu trữ khác nhau hoặc các tập lệnh SQL đặc biệt cần được điều tra.

Một cách đơn giản để hiểu điều này là nhấp vào nút thống kê khách hàng trên thanh công cụ (hoặc nhấn Shift + Alt + S) trong SSMS (SQL Server Management Studio) và chạy một truy vấn đơn giản mà không có con trỏ:

Bây giờ hãy chạy truy vấn với con trỏ bằng cách sử dụng các biến (SQL Cursor Ví dụ 2):

Bây giờ hãy ghi lại sự khác biệt:

Số câu lệnh SELECT không có con trỏ:1

Số câu lệnh SELECT có con trỏ:7

Số vòng quay của máy chủ không có con trỏ:1

Số vòng quay của máy chủ với con trỏ:2

Thời gian xử lý ứng dụng khách không có con trỏ:1

Thời gian xử lý ứng dụng khách với con trỏ:8

Tổng thời gian thực hiện không có con trỏ:1

Tổng thời gian thực hiện với con trỏ:38

Thời gian chờ trên máy chủ trả lời mà không có con trỏ:0

Thời gian chờ trên máy chủ trả lời bằng con trỏ:30

Nói tóm lại, việc chạy truy vấn mà không có con trỏ chỉ trả về 5 hàng là chạy cùng một truy vấn 6-7 lần với con trỏ.

Bây giờ bạn có thể tưởng tượng việc tái tạo tác động bộ nhớ bằng cách sử dụng con trỏ dễ dàng như thế nào, tuy nhiên, đây không phải lúc nào cũng là điều tốt nhất để làm.

Nhiệm vụ thao tác đối tượng cơ sở dữ liệu hàng loạt

Có một lĩnh vực khác mà con trỏ SQL có thể hữu ích và đó là khi chúng ta phải thực hiện một hoạt động hàng loạt trên cơ sở dữ liệu hoặc các đối tượng cơ sở dữ liệu.

Để hiểu điều này, trước tiên, chúng ta cần tạo bảng Khóa học và điền nó vào UniversityV3 cơ sở dữ liệu như sau:

 - Tạo bảng khóa học BẢNG ĐỊNH MỨC [dbo]. [Khóa học] ([Khóa học] INT IDENTITY (1, 1) NOT NULL, [Name] VARCHAR (30) NOT NULL, [Chi tiết] VARCHAR (200) NULL, CONSTRAINT [PK_Course] ĐÃ ĐIỀU CHỈNH TỪ KHÓA CHÍNH ([CourseId] ASC)); - Điền vào bảng CourseSET IDENTITY_INSERT [dbo]. [Course] ONINSERT INTO [dbo]. [Course] ([CourseId], [Name], [Detail]) GIÁ TRỊ (1, N'DevOps for Databases ', N'This is about DevOps for Databases') INSERT INTO [dbo]. [Course] ([CourseId], [Name], [Detail]) VALUES (2, N'Power BI Nguyên tắc cơ bản ', N'Đây là về Nguyên tắc cơ bản của Power BI') CHÈN VÀO [dbo]. [Khóa học] ([Khóa học], [Tên], [Chi tiết]) GIÁ TRỊ (3, Lập trình N'T-SQL ', Không giới thiệu Lập trình T-SQL ') INSERT INTO [dbo]. [Course] ([CourseId], [Name], [Detail]) VALUES (4, N'Tabular Data Modeling', N'Đây là về Mô hình Dữ liệu Dạng bảng ') INSERT INTO [dbo]. [Course] ([CourseId], [Name], [Detail]) CÁC GIÁ TRỊ (5, N'Analysis Services Fundamentals ', N'Đây là về Các Nguyên tắc Cơ bản về Dịch vụ Phân tích') SET IDENTITY_INSERT [dbo]. [Khóa học] TẮT 

Bây giờ, giả sử chúng ta muốn đổi tên tất cả các bảng hiện có trong UniversityV3 cơ sở dữ liệu dưới dạng bảng CŨ.

Điều này yêu cầu con trỏ lặp lại lần lượt trên tất cả các bảng để chúng có thể được đổi tên.

Đoạn mã sau thực hiện công việc:

 - Khai báo con trỏ Sinh viên để đổi tên tất cả các bảng thành oldUSE UniversityV3GODECLARE @TableName VARCHAR (50) - Tên bảng hiện có, @ NewTableName VARCHAR (50) - Tên bảng mớiDECLARE Student_Cursor CURSOR FOR SELECT T.TABLE_NAME FROM INFORMATION_SCHEMA.TABLES T; MỞ Student_CursorFETCH TIẾP THEO TỪ Student_Cursor VÀO @TableNameWHILE @@ FETCH_STATUS =0BEGINSET @ example @ sqldat.com + '_ OLD' - Thêm _OLD vào tên thoát của bảngEXEC sp_rename @ TableName, @ NewTableName - Đổi tên bảng thành bảng OLD - Nhận dữ liệu hàng tiếp theo vào con trỏ và lưu trữ nó thành các biếnINTO @TableNameENDCLOSE Student_Cursor - Đóng khóa con trỏ trên các hàngDEALLOCATE Student_Cursor - Giải phóng tham chiếu con trỏ 

Xin chúc mừng, bạn đã đổi tên thành công tất cả các bảng hiện có bằng con trỏ SQL.

Việc cần làm

Bây giờ bạn đã quen với việc sử dụng con trỏ SQL, vui lòng thử những điều sau:

  1. Hãy cố gắng tạo và đổi tên các chỉ mục của tất cả các bảng của cơ sở dữ liệu mẫu thông qua con trỏ.
  2. Vui lòng cố gắng hoàn nguyên các bảng đã đổi tên trong bài viết này về tên ban đầu bằng con trỏ.
  3. Vui lòng thử điền vào các bảng có nhiều hàng và đo lường số liệu thống kê và thời gian cho các truy vấn có và không có con trỏ.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tiện ích xác minh cụm tạo ra số lượng lớn tệp xml trên hệ thống tệp “/ u01”.

  2. Cách thêm ngày vào ngày trong T-SQL

  3. Kết nối Linux và UNIX với Kho dữ liệu Azure SQL

  4. Giải thích các câu lệnh về cơ sở dữ liệu DROP trong SQL, Bảng DROP và DROP

  5. Cách viết câu lệnh CASE trong SQL