2009-03-27 8 views

Antwort

37

Eigentlich eine Tabelle Variable verwendet wird, eine In-Memory-Tabelle, ist der optimale Weg zu gehen. Die # Tabelle erstellt eine Tabelle in temp db, und ## Tabelle ist global - beide mit Datenträgertreffern. Berücksichtigen Sie die Verlangsamung/Treffer bei der Anzahl der Transaktionen.

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 

Beachten Sie, wie Sie in diese temporäre Tabelle einfügen.

Die Kehrseite davon ist, dass es ein bisschen länger schreiben nehmen können, wie Sie Ihre Tabellenvariable definieren.

Ich würde auch SQL-Eingabeaufforderung für Query Analyzer von RedGate empfehlen.

+1

jedoch diese Methode verwenden, muss die Tabelle Variable eher bei der Kompilierung definiert werden als Laufzeit richtig? Dazu benötigte ich eine dynamisch generierte Tabelle. – Jeff

+0

Die Tabelle Variable wird in der sproc definiert, die ich weiter unten schreiben würde ... – ElHaix

+1

Ugh, aber das ist so ausführlich, zumal TSQL keine „Insert-oder-update“ hat Anweisung ... –

10

Ja, können Sie es schaffen, mit

SELECT INTO ... 

Sagen wir

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

oh das ist was er meinte !! –

+0

Funktioniert das mit einer Tabellenvariablen? – recursive

+0

Ich weiß es nicht, sorry. – boj

28

Sie nicht brauchen OPENQUERY. put „INTO #AnyTableName“ Gerade zwischen der Auswahlliste und der FROM einer Abfrage ...

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

oder Select * in # Temp1 von table1 wo 0 = 1 – GernBlandston

+4

Vergessen Sie nicht, einen 'drop table # Temp1' am Ende der Prozedur zu tun, wenn Sie – Matthieu

Verwandte Themen