Obtuve una consulta SELECT compleja, desde la cual 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 en la variable de la tabla se usarían luego para insertar / actualizar nuevamente en diferentes tablas (principalmente copia 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 hacerlo 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 simplemente dime si lo estoy haciendo todo mal.
fuente
El propósito de
SELECT INTO
es (según los documentos, mi énfasis)¡Pero ya tienes una mesa objetivo! Entonces lo que quieres es
Y en esta sintaxis, está permitido
MyTable
que sea una variable de tabla.fuente
MyTable
aquí es un marcador de posición para el nombre de su tabla real . No creo que haya bases de datos reales con una tabla llamadaMyTable
...También puede usar expresiones de tabla comunes para almacenar conjuntos de datos temporales. Son más elegantes y amigables:
fuente
Podría intentar usar tablas temporales ... si no lo está haciendo desde una aplicación. (Puede estar bien ejecutar esto manualmente)
Omite el esfuerzo de declarar la tabla de esa manera ... Ayuda para consultas ad hoc ... Esto crea una tabla temporal local que no será visible para otras sesiones a menos que esté en la misma sesión. Tal vez sea un problema si está ejecutando una consulta desde una aplicación.
si necesita que se ejecute en una aplicación, use variables declaradas de esta manera:
Editar: muchos de ustedes mencionaron visibilidad actualizada a la sesión desde la conexión. La creación de tablas temporales no es una opción para aplicaciones web, ya que las sesiones se pueden reutilizar, atenerse a las variables temporales en esos casos
fuente
function
. En mi experiencia, en la mayoría de los casos en los que alguien piensa que necesita tales declaraciones, esto en realidad significa que debe repensar sufunction
- o al menos refactorizar aprocedure
. Hablando por mí mismo, al menos. :-)Intenta usar en
INSERT
lugar deSELECT INTO
:fuente
Primero cree una tabla temporal:
Paso 1:
** Paso 2: ** Insertar algún valor en la tabla Temp.
Paso 3: declarar una variable de tabla para contener los datos de la tabla temporal.
Paso 4: seleccione el valor de la tabla temporal e insértelo en la variable de tabla.
Finalmente, el valor se inserta desde una tabla temporal a la variable Tabla
Paso 5: puede verificar el valor insertado en la variable de tabla.
fuente
OK, ahora con suficiente esfuerzo puedo insertar en @table usando lo siguiente:
Lo principal aquí es seleccionar columnas para insertar.
fuente
Una razón para usar SELECT INTO es que le permite usar IDENTITY:
Esto no funcionaría con una variable de tabla, lo cual es una lástima ...
fuente
IDENTITY
embargo, puede declarar una variable de tabla con una columna.