Làm cách nào để bỏ biến bảng trong SQL-Server? Tôi có nên làm điều này không?


123

Tôi có một biến bảng trong một tập lệnh (không phải là một thủ tục được lưu trữ). Hai câu hỏi:

  1. Làm cách nào để bỏ biến bảng? Drop Table @varName đưa ra lỗi "Sai snytax".
  2. Tôi có nên luôn luôn làm điều này? Tôi nghe nói đó là một thực hành tốt. Nó có bao giờ thực sự cần thiết cho những script nhỏ như thế này không?

Đây là mã của tôi:

Declare @projectList table(
    name varchar(40) NOT NULL);

Insert Into @projectList
Values ('BCR-00021')

Select *
From @projectList

Drop Table @projectList -- does not work

Bạn không thể tự bỏ chúng nên phần thứ hai của câu hỏi không áp dụng.
Martin Smith

Câu trả lời:


189

Các biến bảng được tự động cục bộ và tự động loại bỏ - bạn không phải lo lắng về điều đó.


17
+1 - Ngoài ra, bạn không thể bỏ chúng ngay cả khi bạn muốn - chúng vẫn tồn tại miễn là phiên còn mở, giống như bất kỳ biến nào khác. Họ cũng không bị ảnh hưởng bởi các giao dịch.
JNK

10
@JNKs lưu ý rằng chúng không bị ảnh hưởng bởi các giao dịch là rất quan trọng, bạn có thể sử dụng các biến bảng để giữ dữ liệu và ghi vào bảng nhật ký sau khi lỗi gây ra việc khôi phục.
HLGEM

3
Không, nó không giống nhau. Bảng tạm thời tham gia vào các giao dịch.
Paul Perigny

Chúng cũng không giống như CTE.
Hogan

bạn không thể thả chúng nhưng bạn có thể xóa chúng '@projectList xóa';)
RK Sharma

29

Các biến bảng cũng giống như biến int hoặc varchar.

Bạn không cần phải thả chúng. Chúng có các quy tắc phạm vi giống như các biến int hoặc varchar

Phạm vi của một biến là phạm vi các câu lệnh Transact-SQL có thể tham chiếu đến biến. Phạm vi của một biến kéo dài từ thời điểm nó được khai báo cho đến khi kết thúc lô hoặc thủ tục được lưu trữ mà nó được khai báo.


1
Bạn có biết liệu các đối tượng tempdb được tạo bởi các biến bảng có được dọn dẹp khi chúng vượt ra ngoài phạm vi không? Hay máy chủ đợi cho đến khi phiên đóng trước khi dọn dẹp chúng?
StriplingWarrior

21

nếu ai đó khác gặp phải điều này ... và bạn thực sự cần phải loại bỏ nó giống như trong một vòng lặp, bạn chỉ có thể xóa tất cả khỏi biến bảng:

DELETE FROM @tableVariableName

7

Nhưng tất cả các bạn đều quên đề cập rằng nếu một bảng biến được sử dụng trong một vòng lặp, nó sẽ cần làm trống (xóa @table) trước khi tải lại với dữ liệu trong một vòng lặp.


3

Cũng giống như TempTables, một biến bảng cục bộ cũng được tạo trong TempDB. Phạm vi của biến bảng là lô, thủ tục được lưu trữ và khối câu lệnh mà nó được khai báo. Chúng có thể được truyền dưới dạng tham số giữa các thủ tục. Chúng tự động bị loại bỏ khi bạn đóng phiên mà bạn tạo chúng.


#temp table không giống như biến @table, nó không tự động giảm xuống sau khi kết thúc bản vá hoặc phạm vi, nó chỉ tự động giảm xuống nếu nó được tạo bên trong thủ tục được lưu trữ và thủ tục được lưu trữ đã hoàn tất thực thi
Abou-Emish

1

Đây là một giải pháp

Declare @tablename varchar(20)
DECLARE @SQL NVARCHAR(MAX)

SET @tablename = '_RJ_TEMPOV4'
SET @SQL = 'DROP TABLE dbo.' + QUOTENAME(@tablename) + '';

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@tablename) AND type in (N'U'))
    EXEC sp_executesql @SQL;

Hoạt động tốt trên SQL Server 2014 Christophe

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.