Đang kiểm tra #tbl
Nó không thể bị tổn thương để kiểm tra sự tồn tại của bảng (và thả nó nếu nó tồn tại) vào đầu các thủ tục, nhưng nó phụ thuộc vào cách bạn muốn xử lý kịch bản đó, và trong nhiều trường hợp nó không thể cho nó tồn tại đã dù sao đi nữa (ít nhất là nếu chúng ta đang nói về cùng một bảng #temp như được định nghĩa trong quy trình được lưu trữ đó).
Bạn kiểm tra sự tồn tại của bảng bằng cách sử dụng:
IF OBJECT_ID('tempdb..#tablename') IS NOT NULL
Bạn không thể kiểm tra tempdb.sys.tables vì tên thực tế là #tablename__________some hex code
và bạn không nên sử dụng OBJECT_ID('...') > 0
vì vấn đề tiềm ẩn này .
Tất nhiên, có những trường hợp ngoại lệ. Hai điều đó đến với tâm trí:
nếu bạn gọi tất cả mọi thứ #temp
, hoặc #t
, hoặc #x
, thì có thể một bảng như vậy đã tồn tại từ một phạm vi bên ngoài trước khi gọi thủ tục. Bạn có thể tạo ra một trường hợp mà bạn nên bỏ nó và tạo một cái mới trong trường hợp đó, nhưng bạn cũng có thể tạo ra một trường hợp rằng đây là một điều kiện lỗi bạn muốn biết - vì vậy có thể nó không CREATE TABLE #x
thành công.
bạn thực sự có thể muốn sử dụng bảng #temp được tạo trong phạm vi bên ngoài và chỉ tạo một bảng nếu nó chưa được xác định trong phạm vi bên ngoài đó. Điều này là có thể và tôi sử dụng kỹ thuật này mọi lúc, nhưng thường chỉ khi tôi muốn thu thập dữ liệu từ các quy trình hệ thống mà tôi không thể dễ dàng tự thao tác (ví dụ sp_helptext
). Vì vậy, tôi có thể làm điều này:
CREATE TABLE #x([Text] NVARCHAR(MAX));
GO
CREATE PROCEDURE dbo.myhelp @p SYSNAME
AS
INSERT #x EXEC sp_helptext @p;
GO
EXEC dbo.myhelp N'dbo.myhelp'; -- inception
GO
SELECT [Text] FROM #x;
Điều này hoạt động mặc dù #x
được xác định bên ngoài. Đó là một ví dụ tồi tệ bởi vì tôi thích sử dụng hơn sys.sql_modules
, nhưng tôi chắc chắn rằng bạn hiểu rõ và có thể hình dung bạn có thể làm điều đó bằng các thủ tục của riêng bạn như thế nào.
Trên BẢNG DROP #tbl;
Tôi nghĩ rằng liệu bạn có nên bỏ các bảng #temp một cách rõ ràng vào cuối quy trình hay không là rất nhiều tranh luận, và do đó sẽ bị đóng cửa vì chủ yếu dựa trên quan điểm; xem những bài đăng trên blog tuyệt vời này của Paul White , đọc chúng kỹ lưỡng và quay lại và đặt ra một câu hỏi cụ thể nếu tất cả các bạn không trả lời: