Có cách nào để xác định bảng tạm thời mà không xác định lược đồ của nó ở phía trước không?TSQL Xác định Bảng tạm thời (hoặc biến bảng) mà không định nghĩa lược đồ?
Trả lời
Trên thực tế sử dụng một BIẾN bảng, một bảng trong bộ nhớ, là cách tối ưu để đi. #table tạo một bảng trong db tạm thời và bảng ## là toàn cục - cả hai đều có lần truy cập đĩa. Xem xét tốc độ chậm/số lần truy cập có kinh nghiệm với số lượng giao dịch.
CREATE PROCEDURE [dbo].[GetAccounts]
@AccountID BIGINT,
@Result INT OUT,
@ErrorMessage VARCHAR(255) OUT
AS
BEGIN
SET NOCOUNT ON;
SET @Result = 0
SET @ErrorMessage = ''
DECLARE @tmp_Accounts TABLE (
AccountId BIGINT,
AccountName VARCHAR(50),
...
)
INSERT INTO @tmp_Accounts ([AccountId], [AccountName]...
)
SELECT AccountID, AccountName
FROM Accounts
WHERE ...
IF @@Rowcount = 0
BEGIN
SET @ErrorMessage = 'No accounts found.'
SET @Result = 0
RETURN @Result
END
ELSE
BEGIN
SET @Result = 1
SELECT *
FROM @tmp_Accounts
END
Lưu ý cách bạn chèn vào bảng tạm thời này.
Mặt trái của điều này là có thể mất nhiều thời gian hơn để viết, vì bạn phải xác định biến bảng của mình.
Tôi cũng muốn giới thiệu SQL Prompt cho Query Analyzer bởi RedGate.
bạn không cần OPENQUERY. Chỉ cần đặt "VÀO #AnyTableName" giữa danh sách lựa chọn và FROM của bất kỳ truy vấn ...
SELECT *
INTO #Temp1
FROM table1
WHERE x=y
hoặc Chọn * vào # Temp1 từ bảng1 trong đó 0 = 1 – GernBlandston
Đừng quên thực hiện 'thả bảng # Temp1' ở cuối quy trình nếu bạn sử dụng phương thức này – Matthieu
Tuy nhiên, biến bảng phải được xác định khi biên dịch thay vì hơn thời gian chạy phải không? Đối với điều này tôi cần một bảng được tạo động. – Jeff
Biến bảng được định nghĩa trong sproc, mà tôi sẽ đăng bên dưới ... – ElHaix
Ugh, nhưng điều này quá chi tiết, đặc biệt là vì TSQL không có câu lệnh "Chèn hoặc cập nhật" ... –