¿TSQL Define Tabla Temporal (o variable de tabla) Sin Definir Esquema?


¿Hay alguna forma de definir una tabla temporal sin definir su esquema por adelantado?

Author: mwigdahl, 2009-03-27

3 answers

En realidad, usar una VARIABLE de tabla, una tabla en memoria, es la forma óptima de hacerlo. La tabla # crea una tabla en temp db, y la tabla ##es global, ambas con accesos al disco. Considere la ralentización / éxito experimentado con el número 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 

Tenga en cuenta la forma en que inserta en esta tabla temporal.

El lado negativo 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 el Analizador de consultas por RedGate.

 38
Author: ElHaix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-21 20:09:26

No necesita OPENQUERY. Simplemente ponga "EN # AnyTableName" entre la lista de selección y el DESDE de cualquier consulta...

SELECT *
    INTO #Temp1
    FROM table1
    WHERE x=y
 28
Author: KM.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-27 21:17:19

Sí, puedes crearlo con

SELECT INTO ...

Digamos

SELECT * INTO #t
FROM OPENQUERY( 'server',
'exec database.dbo.proc_name value1, value2, ... ' )
 10
Author: boj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-27 01:59:09