SELECCIONAR EN una variable de tabla en T-SQL


Tengo una consulta de SELECCIÓN compleja, desde la que me gustaría insertar todas las filas en una variable de tabla, pero T-SQL no lo permite.

En la misma línea, no puede usar una variable de tabla con las consultas SELECT INTO o INSERT EXEC. http://odetocode.com/Articles/365.aspx

Breve ejemplo:

declare @userData TABLE(
                        name varchar(30) NOT NULL,
                        oldlocation varchar(30) NOT NULL
                       )

SELECT name, location
INTO @userData
FROM myTable
    INNER JOIN otherTable ON ...
WHERE age > 30

Los datos de la variable tabla se usarían más tarde para insertarlos/actualizarlos de nuevo en diferentes tablas (en su mayoría copias de los mismos datos con actualizaciones menores). El objetivo de esto sería simplemente hacer que el script sea un poco más legible y más fácilmente personalizable que hacer el SELECT INTO directamente en las tablas correctas. El rendimiento no es un problema, ya que rowcount es bastante pequeño y solo se ejecuta manualmente cuando es necesario.
...o solo dime si lo estoy haciendo todo mal.

Author: iamdave, 2010-10-01

8 answers

Intenta algo como esto:

DECLARE @userData TABLE(
    name varchar(30) NOT NULL,
    oldlocation varchar(30) NOT NULL
);

INSERT INTO @userData (name, oldlocation)
SELECT name, location FROM myTable
INNER JOIN otherTable ON ...
WHERE age > 30;
 472
Author: CristiC,
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
2018-02-17 23:13:12

El propósito de SELECT INTO es (según los documentos, mi énfasis)

A crear una nueva tabla a partir de valores en otra tabla

Pero ya tiene una tabla de destino! Así que lo que quieres es

La instrucción INSERT añade una o más filas nuevas a una tabla

Puede especificar los valores de datos en el las siguientes formas:

...

Usando una subconsulta SELECT para especificar los valores de datos para una o más filas, como:

  INSERT INTO MyTable 
 (PriKey, Description)
        SELECT ForeignKey, Description
        FROM SomeView

Y en esta sintaxis, se permite que MyTable sea una variable de tabla.

 80
Author: AakashM,
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
2010-10-01 10:28:52

También puede usar expresiones de tabla comunes para almacenar conjuntos de datos temporales. Son más elegantes y adhoc amigable:

WITH userData (name, oldlocation)
AS
(
  SELECT name, location 
  FROM   myTable    INNER JOIN 
         otherTable ON ...
  WHERE  age>30
)
SELECT * 
FROM   userData -- you can also reuse the recordset in subqueries and joins
 18
Author: nanestev,
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
2017-02-22 16:54:43

Puede intentar usar tablas temporales...

SELECT name, location INTO #userData FROM myTable
INNER JOIN otherTable ON ...
WHERE age>30

Omites el esfuerzo de declarar la tabla de esa manera... Ayuda para consultas adhoc...Esto crea una tabla temporal local que no será visible para otras conexiones a menos que use la misma conexión en su aplicación.

Si se requieren variables se puede declarar de esta manera :

DECLARE @userData TABLE(
    name varchar(30) NOT NULL,
    oldlocation varchar(30) NOT NULL
);

INSERT INTO @userData
SELECT name, location FROM myTable
INNER JOIN otherTable ON ...
WHERE age > 30;
 13
Author: Mulki,
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
2017-10-18 20:18:46

Intenta usar INSERT en lugar de SELECT INTO:

INSERT @UserData   
SELECT name, location etc.
 6
Author: Noel Abrahams,
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
2013-03-15 19:13:20

Primero cree una tabla temporal:

Paso 1:

create table #tblOm_Temp (

    Name varchar(100),
    Age Int ,
    RollNumber bigint
)

**Paso 2: ** Inserte algún valor en la tabla Temporal .

insert into #tblom_temp values('Om Pandey',102,1347)

Paso 3: Declare una variable de tabla para contener los datos de la tabla temporal.

declare   @tblOm_Variable table(

    Name Varchar(100),
    Age int,
    RollNumber bigint
)

Paso 4: seleccione el valor de la tabla temporal e insértelo en la variable de la tabla.

insert into @tblOm_Variable select * from #tblom_temp

Finalmente se inserta el valor de una tabla temporal a la variable de la tabla

Paso 5: Puede Verificar el valor insertado en la variable de la tabla.

select * from @tblOm_Variable
 4
Author: 404 Not found,
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
2015-05-22 04:43:43

OK, ahora con suficiente esfuerzo soy capaz de insertar en @table usando lo siguiente:

INSERTAR @TempWithheldTable SELECCIONAR
a. Motivo suspendido, a. Notas suspendidas, a. Suspendido por , a. Código DE razón DE OPENROWSET (BULK ' C:\DataBases\WithHeld.csv', FORMATFILE = N'C:\DataBases\Format.txt",
ERRORFILE = N'C:\Temp\MovieLensRatings.txt" ) COMO a;

Lo principal aquí es seleccionar columnas para insertar .

 0
Author: RahulJha,
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
2017-09-22 09:29:53

Una razón para usar SELECT INTO es que le permite usar IDENTIDAD:

SELECT IDENTITY(INT,1,1) AS Id, name
INTO #MyTable 
FROM (SELECT name FROM AnotherTable) AS t

Esto no funcionaría con una variable de tabla, lo cual es muy malo...

 -4
Author: MOHCTP,
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
2013-08-23 00:20:30