2009-03-27 12 views

Trả lời

37

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.

+1

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

+0

Biến bảng được định nghĩa trong sproc, mà tôi sẽ đăng bên dưới ... – ElHaix

+1

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" ... –

10

Vâng, bạn có thể tạo ra nó với

SELECT INTO ... 

Hãy nói rằng

SELECT * INTO #t 
FROM OPENQUERY('server', 
'exec database.dbo.proc_name value1, value2, ... ') 
+0

oh đó là ý của anh ấy !! –

+0

Điều đó có hoạt động với một biến bảng không? – recursive

+0

Tôi không biết, xin lỗi. – boj

28

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 
+0

hoặc Chọn * vào # Temp1 từ bảng1 trong đó 0 = 1 – GernBlandston

+4

Đừ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