2010-11-19 7 views
15

Tôi biết đây có thể là câu hỏi lặp lại, nhưng tôi muốn trả lời nhanh, không muốn tìm kiếm thêm ... vâng .... Cảm ơn bạn đã trả lời trước ....Cách sử dụng con trỏ chính xác trong máy chủ sql

Tôi muốn viết con trỏ, tôi muốn hiểu cách sử dụng, cú pháp của nó và trong trường hợp nào chúng ta có thể sử dụng điều này trong thủ tục lưu sẵn? Cú pháp khác nhau cho máy chủ sql 2008, sql server 2008 R2 và sql server 2005 là gì?

Tại sao cần sử dụng?

+7

hãy tìm kiếm nó trước .... – anishMarokey

+1

Tìm kiếm thực sự không mất nhiều thời gian, tôi thấy bài viết này dễ dàng và nó bao gồm hầu hết các câu hỏi bạn đang hỏi: http://www.sqlteam.com/article/cursors -an-overview – Tony

Trả lời

22

Con trỏ là một cơ chế liệt kê rõ ràng thông qua các hàng của tập hợp kết quả, thay vì truy xuất nó như vậy. Tuy nhiên, trong khi chúng có thể thoải mái hơn khi sử dụng cho các lập trình viên quen với việc viết While Not RS.EOF Do ..., chúng thường là một điều cần tránh trong các thủ tục lưu sẵn SQL Server nếu có thể - nếu bạn có thể viết truy vấn mà không cần sử dụng con trỏ, bạn cung cấp cho trình tối ưu hóa một cơ hội tốt hơn để tìm một cách nhanh chóng để triển khai nó.

Trong tất cả sự trung thực, tôi chưa bao giờ tìm thấy trường hợp sử dụng thực tế cho con trỏ không thể tránh được, ngoại trừ một số tác vụ quản trị như lặp qua tất cả các chỉ mục trong danh mục và xây dựng lại chúng. Tôi cho rằng chúng có thể có một số công dụng trong việc tạo báo cáo hoặc kết hợp thư, nhưng có lẽ hiệu quả hơn khi thực hiện công việc giống như con trỏ trong một ứng dụng nói với cơ sở dữ liệu, cho phép cơ sở dữ liệu làm những gì tốt nhất.

+0

+1 hầu hết thời gian họ không cần thiết. Chỉ sử dụng chúng trong công việc một lần hoặc khi tất cả các tùy chọn khác không thành công. –

+4

Nhu cầu thực sự duy nhất cho con trỏ mà tôi đã tìm thấy là khi liên quan đến trình kích hoạt - nếu bạn có nhiều bản ghi bị ảnh hưởng và bạn muốn thực thi một proc được lưu trữ cho mỗi bản ghi, bạn cần trỏ qua các bảng kích hoạt (ví dụ: "CH INSN") – RPM1984

+0

Vì vậy, một con trỏ được sử dụng để lặp qua các hàng của một tập kết quả, ví dụ như cập nhật trạng thái của 100 hàng từ đang chờ để hoàn thành? – JsonStatham

5

Con trỏ có thể được sử dụng để truy xuất hàng dữ liệu theo hàng cơ sở. Hành động giống như một câu lệnh lặp (tức là trong khi hoặc vòng lặp). Để sử dụng con trỏ trong thủ tục SQL, bạn cần thực hiện như sau: 1.Declare con trỏ xác định tập hợp kết quả. 2.Mở con trỏ để thiết lập tập kết quả. 3. Tìm nạp dữ liệu vào các biến cục bộ khi cần từ con trỏ, một hàng tại một thời điểm. 4.Đóng con trỏ khi hoàn tất.

cho ví dụ:

declare @tab table 
(
Game varchar(15), 
Rollno varchar(15) 
) 
insert into @tab values('Cricket','R11') 
insert into @tab values('VollyBall','R12') 

declare @game varchar(20) 
declare @Rollno varchar(20) 

declare cur2 cursor for select game,rollno from @tab 

open cur2 

fetch next from cur2 into @game,@rollno 

WHILE @@FETCH_STATUS = 0 
begin 

print @game 

print @rollno 

FETCH NEXT FROM cur2 into @game,@rollno 

end 

close cur2 

deallocate cur2 
13

con trỏ được sử dụng vì trong truy vấn phụ chúng ta có thể lấy hàng kỷ lục của hàng vì vậy chúng tôi sử dụng con trỏ để lấy hồ sơ

Ví dụ về con trỏ:

DECLARE @eName varchar(50), @job varchar(50) 

DECLARE MynewCursor CURSOR -- Declare cursor name 

FOR 
Select eName, job FROM emp where deptno =10 

OPEN MynewCursor -- open the cursor 

FETCH NEXT FROM MynewCursor 
INTO @eName, @job 

PRINT @eName + ' ' + @job -- print the name 

WHILE @@FETCH_STATUS = 0 

BEGIN 

FETCH NEXT FROM MynewCursor 
INTO @ename, @job 

PRINT @eName +' ' + @job -- print the name 

END 

CLOSE MynewCursor 

DEALLOCATE MynewCursor 

OUTPUT:

ROHIT       PRG 
jayesh       PRG 
Rocky       prg 
Rocky       prg 
+0

Vui lòng chỉnh sửa câu trả lời của bạn và định dạng mã để làm cho nó có thể đọc được. – kleopatra

+0

chúng ta có thể nhận được kết quả tương tự từ truy vấn đơn giản 'Chọn eName, công việc FROM emp nơi deptno = 10' vậy tại sao sử dụng con trỏ để lặp nó, bất kỳ sử dụng thực tế? – Thunder

+0

Tôi có một câu hỏi tôi có thể sử dụng kết quả thiết lập trong con trỏ giống như tất cả các ví dụ được tìm thấy trong google đang sử dụng 'PRINT' Name: '+ @ name +', pagename: '+ convert (varchar (20), @ salary) 'nhưng tôi có thể kết quả trả về được đặt từ đây thành C#? –

0

tôi sẽ tranh luận bạn có thể muốn sử dụng một con trỏ khi bạn muốn làm so sánh các đặc điểm đó là trên các hàng khác nhau của tập trở lại, hoặc nếu bạn muốn viết một định dạng hàng đầu ra khác nhau hơn là một tiêu chuẩn trong một số trường hợp nhất định Hai ví dụ đến với tâm trí. Một là ở một trường đại học, nơi mỗi lần thêm và thả một lớp có hàng riêng trong bảng. Nó có thể đã được thiết kế xấu nhưng bạn cần phải so sánh trên các hàng để biết có bao nhiêu thêm và thả các hàng bạn đã có để xác định xem người đó có trong lớp hay không. Tôi không thể nghĩ ra một cách thẳng về phía trước để làm điều đó chỉ với sql. Một ví dụ khác là viết một dòng tổng số tạp chí cho tạp chí GL. Bạn nhận được một số lượng ghi nợ và tín dụng tùy ý trong nhật ký của mình, bạn có nhiều tạp chí trong hàng trả về của bạn, và bạn muốn viết một dòng tổng số tạp chí mỗi khi bạn hoàn thành một tạp chí để đăng nó vào một Sổ Cái.Với một con trỏ, bạn có thể biết khi nào bạn để lại một tạp chí và bắt đầu một tạp chí khác và tích lũy số tiền ghi nợ và tín dụng của bạn và viết một dòng tổng cộng (hoặc bảng chèn) khác với dòng ghi nợ/tín dụng.