Tengo una gran variable de tipo de tabla definida por el usuario que tiene 129 columnas. Almacenaré alrededor de 2000-3000 registros en esta variable de tabla a la vez y los pasaré a varios procedimientos y funciones almacenados para obtener datos adicionales y realizar modificaciones. Estos datos adicionales y las nuevas modificaciones se almacenarán en una nueva variable de tabla del mismo tipo y se devolverán al procedimiento almacenado de origen a través de un OUTPUT
parámetro. (Esto se debe a que un parámetro de tipo de tabla solo se puede pasar como READONLY
).
Este es mi pseudocódigo:
SP1
@tmp tableType
{
INSERT @tmp EXEC
SP2 (@tmp)
INSERT @tmp EXEC
SP3 (@tmp)
}
¿Debo usar un @table_variable
o #temp_table
?
sql-server
sql-server-2008
performance
Sreekumar P
fuente
fuente
Respuestas:
Hay dos blogs que debes mirar. El primero ( aquí ) es una comparación de variables de tabla y tablas temporales. Es de 2008 y sigue siendo relevante para SQL Server 2008 R2.
La segunda entrada del blog ( aquí ) trata algunos de los conceptos erróneos (conceptos perdidos) con respecto a las variables de tabla; incluida la indexación de una variable de tabla.
Ambas entradas de blog, artículos, están escritos por Gail Shaw.
Creo que el único elemento revelador que está buscando es una variable de tabla que no se puede pasar entre los procedimientos almacenados, mientras que una tabla temporal se puede pasar entre los procedimientos almacenados. Lo más parecido a una variable de tabla para pasar entre procedimientos almacenados es como un tipo de tabla definida por el usuario.
Pasar una variable de tabla como TVP a un procedimiento almacenado tiene el requisito de que debe definirse como un parámetro de SOLO LECTURA. Esto implica que habrá múltiples copias de la Variable de tabla si desea devolver una copia modificada de la misma.
En total, el paso entre el procedimiento almacenado puede ser mejor atendido por una tabla temporal cuando desea devolver la estructura pasada con valores actualizados.
fuente
Nada mejor que probar ambos, pero encuentro que #tempTables funciona mejor una vez que ingresas a los cientos de registros.
fuente