2012-09-10 39 views
5

Nếu tôi chạy dưới đây trong MS SQL 2008 R2 tôi nhận được một kết quả không mong muốn.Phạm vi biến bảng trong con trỏ SQL

create table #DataTable (someID varchar(5)) 
insert into #DataTable 
values ('ID1'),('ID2'),('ID3'),('ID4'),('ID5') 

declare @data varchar(8); 

declare myCursor cursor for 
select someID from #DataTable 

open myCursor 
FETCH NEXT FROM myCursor INTO 
@data 

WHILE(@@Fetch_Status >=0) 
BEGIN 

    declare @tempTable table (someValue varchar(10)) 

    insert into @tempTable select @data + '_ASDF' 
    select * from @tempTable  

FETCH NEXT FROM myCursor INTO 
@data 

END 

close myCursor 
deallocate myCursor 

drop table #DataTable 

Kết quả của phiên cuối cùng:

someValue 
ID1_ASDF 
ID2_ASDF 
ID3_ASDF 
ID4_ASDF 
ID5_ASDF 

tôi haved mong đợi chỉ để xem

someValue 
ID5_ASDF 

Dường như biến bảng @tempTable được giữ trong phạm vi giữa lặp con trỏ - nhưng làm thế nào là nó sau đó có thể tái tuyên bố biến trong mỗi lần lặp? Không có ý nghĩa với tôi.

tôi giải quyết nó bằng

delete @tempTable 

trong mỗi lần lặp - mà cũng sao lưu các giả định của tôi về nó vẫn đang trong phạm vi.

Có ai có thể giải thích hành vi này không?

Trả lời

5

Vâng, nó - phạm vi không được xác định bởi begin/end báo cáo, nhưng vào cuối của một thủ tục lưu trữ, hoặc một go

The scope of a variable is the range of Transact-SQL statements that can reference the variable. The scope of a variable lasts from the point it is declared until the end of the batch or stored procedure in which it is declared.

http://msdn.microsoft.com/en-us/library/ms187953(v=sql.105).aspx

+1

cảm ơn - nhưng làm cách nào để có thể khai báo biến một lần nữa trong mỗi lần lặp? – zmaster

2

tờ khai Biến trong T -SQL là một chút của một con thú lẻ - khai báo biến bỏ qua luồng điều khiển.

Điều này tạo ra một lỗi:

set @a = 2 

này chạy không vấn đề, và không in "Không bao giờ":

if 1=0 
begin 
    print 'Never' 
    declare @a int 
end 
set @a = 2 

Thời gian tồn tại của một biến là từ quan điểm kê khai cho đến khi hoàn thành hàng loạt.

+0

ha, lạ. Tôi nghĩ rằng không có lý do gì để tôi tự hỏi làm thế nào có thể khai báo cùng một biến hai lần trong con trỏ khi bạn chỉ cho tôi một cái gì đó như thế :) – zmaster

+0

@zmaster - vì các khai báo bỏ qua luồng điều khiển, chúng không được khai báo nhiều hơn một lần bên trong bất kỳ vòng lặp hoặc con trỏ. Nếu họ đã làm, bạn sẽ nhận được một lỗi và sẽ không được phép khai báo một biến bên trong một vòng lặp. Nếu bạn rõ ràng có hai câu lệnh khai báo có cùng tên biến, thì bạn sẽ gặp lỗi nếu chúng có trong vòng lặp hay không. – JeffO

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