2009-03-27 15 views

Odpowiedz

37

rzeczywiście przy zmiennej stołowego, tablicę w pamięci, jest optymalnym rozwiązaniem. #table tworzy tabelę w tempach db, a tabela ## jest globalna - zarówno przy trafieniach na dysku. Weź pod uwagę spowolnienie/przebicie z liczbą transakcji.

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 

Uwaga sposób wstawiania do tej tabeli temp.

Wadą tego jest to, że napisanie może potrwać nieco dłużej, ponieważ trzeba zdefiniować zmienną tabeli.

Polecam także program SQL Quote Analyzer firmy RedGate.

+1

Jednak zmienna tabeli musi być zdefiniowana podczas kompilacji raczej niż biegnij, prawda? Do tego potrzebowałem dynamicznie generowanego stołu. – Jeff

+0

Zmienna tablicowa jest zdefiniowana w sproc, którą opublikuję poniżej ... – ElHaix

+1

Ugh, ale jest to bardzo szczegółowe, zwłaszcza, że ​​TSQL nie ma instrukcji "Wstawiaj lub aktualizuj" ... –

10

Tak, można go utworzyć z

SELECT INTO ... 

Powiedzmy

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

o to właśnie miał na myśli !! –

+0

Czy to działa ze zmienną tabeli? – recursive

+0

Nie wiem, przepraszam. – boj

28

nie trzeba OPENQUERY. Wystarczy umieścić „Into #AnyTableName” między listy select i FROM jakiegokolwiek zapytania ...

SELECT * 
    INTO #Temp1 
    FROM table1 
    WHERE x=y 
+0

lub Wybierz * na # Temp1 z tabeli1, gdzie 0 = 1 – GernBlandston

+4

Nie zapomnij zrobić tabeli upuść # Temp1' na końcu procedury, jeśli używasz tej metody – Matthieu