2009-03-27 10 views

Respuesta

37

En realidad usando una variable de tabla, una tabla en memoria, es la mejor manera de ir. El #table crea una tabla en temp db, y ## table es global, ambos con hits de disco. Considere la ralentización/golpe experimentado con la cantidad de transacciones.

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 

Observe cómo se inserta en esta tabla de temperatura.

La desventaja de esto es que puede tomar un poco más de tiempo escribir, ya que tiene que definir su variable de tabla.

También recomendaría SQL Prompt para Query Analyzer de RedGate.

+1

Sin embargo, la variable de la tabla debe definirse en compilación en vez que el tiempo de ejecución ¿verdad? Para esto, necesitaba una tabla generada dinámicamente. – Jeff

+0

La variable de la tabla se define en el comando sproc, que publicaré a continuación ... – ElHaix

+1

Ugh, pero esto es muy detallado, especialmente porque TSQL no tiene una instrucción "Insertar o actualizar" ... –

10

Sí, puede crear con

SELECT INTO ... 

Digamos

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

¡¡¡eso es lo que quiso decir !! –

+0

¿Funciona eso con una variable de tabla? – recursive

+0

No lo sé, lo siento. – boj

28

que no es necesario OPENQUERY. Sólo hay que poner "en #AnyTableName" entre la lista de selección y la DE de cualquier consulta ...

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

o Seleccione * en # Temp1 desde la tabla1 donde 0 = 1 – GernBlandston

+4

No olvide hacer una 'tabla desplegable # Temp1' al final de su procedimiento si usa este método – Matthieu

Cuestiones relacionadas