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.
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;
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 tablaPuede 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.
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
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;
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.
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
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 .
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...
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