2009-03-27 9 views

Répondre

37

En fait, en utilisant une variable de table, une table en mémoire, est la meilleure façon d'aller. Le #table crée une table dans temp db, et ## table est global - les deux avec des hits de disque. Considérez le ralentissement/hit expérimenté avec le nombre de transactions.

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 

Notez la manière dont vous insérez dans cette table temporaire. L'inconvénient de ceci est que cela peut prendre un peu plus de temps à écrire, car vous devez définir votre variable de table.

Je recommanderais également l'invite SQL pour l'analyseur de requêtes par RedGate.

+1

Cependant, la variable de table doit être définie au moment de la compilation plutôt que le temps d'exécution à droite? Pour cela, j'avais besoin d'une table générée dynamiquement. – Jeff

+0

La variable de table est définie dans le sproc, que je publierai ci-dessous ... – ElHaix

+1

Ugh, mais c'est tellement bavard, d'autant plus que TSQL n'a pas d'instruction "Insert-or-update" ... –

10

Oui, vous pouvez créer avec

SELECT INTO ... 

Disons que

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

oh c'est ce qu'il voulait dire !! –

+0

Est-ce que cela fonctionne avec une variable de table? – recursive

+0

Je ne sais pas, désolé. – boj

28

vous n'avez pas besoin OPENQUERY. Il suffit de mettre « dans #AnyTableName » entre la liste de sélection et la requête d'une ...

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

ou Sélectionnez * dans # Temp1 à partir de la table1 où 0 = 1 – GernBlandston

+4

N'oubliez pas de faire une 'drop table # Temp1' à la fin de votre procédure si vous utilisez cette méthode – Matthieu

Questions connexes