tipo temporales tablas tabla las indice guardan eliminar ejemplo donde dinamica crear consultar sql sql-server tsql temp-tables

temporales - tabla temporal sql server ejemplo



TSQL selecciona en tabla Temp desde sql dinĂ¡mico (5)

Esto parece relativamente simple, pero aparentemente no lo es.

Necesito crear una tabla temporal basada en una tabla existente a través de la sintaxis select into:

SELECT * INTO #TEMPTABLE FROM EXISTING_TABLE

El problema es que el nombre de la tabla existente se acepta a través de un parámetro ...

Puedo obtener los datos de la tabla a través de:

execute (''SELECT * FROM '' + @tableName)

pero ¿cómo casarme con los dos para poder poner los resultados de la ejecución directamente en la tabla temporal?

Las columnas para cada tabla para la que se va a utilizar no son las mismas, por lo que construir la tabla temporal antes de obtener los datos no es práctico.

Estoy abierto a cualquier sugerencia, excepto el uso de una tabla global de temperatura.

Actualizar:

Esto es completamente ridículo, PERO mis reservas con la tabla temporal global es que esta es una plataforma multiusuario que se presta a problemas si la tabla persiste por largos períodos de tiempo ...

Entonces ... solo para pasar esta parte comencé usando la ejecución para generar una tabla global de temperatura.

execute(''select * into ##globalDynamicFormTable from '' + @tsFormTable)

Luego uso la tabla global de temperatura para cargar la tabla temporal local:

select * into #tempTable from ##globalDynamicFormTable

Luego dejo caer la tabla global.

drop table ##globalDynamicFormTable

esto es sucio y no me gusta, pero por el momento, hasta que tenga una mejor solución, tendrá que funcionar.

En el final:

Supongo que no hay forma de evitarlo.

La mejor respuesta parece ser cualquiera;

Cree una vista en el comando de ejecución y utilícela para cargar la tabla temporal local en el procedimiento almacenado.

Cree una tabla temporal global en el comando de ejecución y utilícela para cargar la tabla temporal local.

Dicho esto, probablemente me quedo con la tabla temporal global porque la creación y caída de vistas se audita en mi organización, y estoy seguro de que van a cuestionar eso si comienza a suceder todo el tiempo.

¡Gracias!


Un ejemplo de trabajo.

DECLARE @TableName AS VARCHAR(100) SELECT @TableName = ''YourTableName'' EXECUTE (''SELECT * INTO #TEMP FROM '' + @TableName +''; SELECT * FROM #TEMP;'')

Segunda solución con tabla de temperatura accesible

DECLARE @TableName AS VARCHAR(100) SELECT @TableName = ''YOUR_TABLE_NAME'' EXECUTE (''CREATE VIEW vTemp AS SELECT * FROM '' + @TableName) SELECT * INTO #TEMP FROM vTemp --DROP THE VIEW HERE DROP VIEW vTemp /*START USING TEMP TABLE ************************/ --EX: SELECT * FROM #TEMP --DROP YOUR TEMP TABLE HERE DROP TABLE #TEMP


Eche un vistazo a OPENROWSET y haga algo como:

SELECT * INTO #TEMPTABLE FROM OPENROWSET(''SQLNCLI'' , ''Server=(local)/SQL2008;Trusted_Connection=yes;'', ''SELECT * FROM '' + @tableName)


declare @sql varchar(100); declare @tablename as varchar(100); select @tablename = ''your_table_name''; create table #tmp (col1 int, col2 int, col3 int); set @sql = ''select aa, bb, cc from '' + @tablename; insert into #tmp(col1, col2, col3) exec @sql; select * from #tmp;


Cómo lo hice con un pivote en sql dinámico (#AccPurch se creó antes de esto)

DECLARE @sql AS nvarchar(MAX) declare @Month Nvarchar(1000) --DROP TABLE #temp select distinct YYYYMM into #temp from #AccPurch AS ap SELECT @Month = COALESCE(@Month, '''') + ''['' + CAST(YYYYMM AS VarChar(8)) + ''],'' FROM #temp SELECT @Month= LEFT(@Month,len(@Month)-1) SET @sql = N''SELECT UserID, ''+ @Month + N'' into ##final_Donovan_12345 FROM ( Select ap.AccPurch , ap.YYYYMM , ap.UserID , ap.AccountNumber FROM #AccPurch AS ap ) p Pivot (SUM(AccPurch) FOR YYYYMM IN (''+@Month+ N'')) as pvt'' EXEC sp_executesql @sql Select * INTO #final From ##final_Donovan_12345 DROP TABLE ##final_Donovan_12345 Select * From #final AS f


Puedo pensar en algunas formas de seleccionar datos de una tabla cuyo nombre se generó dinámicamente, sin usar tablas temporales globales.

Solución 1

Construya la cadena que contiene el nombre de su tabla fuente y haga que toda su consulta sea dinámica.

Solución 2

Esta solución, que implica una variable de tabla, funcionará, siempre que sepa ...

  • ... el número, nombre y tipo de las columnas ...
  • ... el nombre de la columna de la clave principal EDITAR : (vale, aparentemente esto no es estrictamente cierto, ya que se puede generar dinámicamente ) ...

en tu tabla fuente.

-- Number of rows in your source table DECLARE @RowCount INT; SELECT @RowCount = SUM(st.row_count) FROM sys.dm_db_partition_stats st WHERE object_name(object_id) = EmployeesWeek_ + CONVERT( VARCHAR(10),WEEK(GETDATE()) ) AND (index_id < 2); -- All columns from your source table DECLARE @col1 int; DECLARE @col2 varchar(50); DECLARE @col3 varchar(5); DECLARE @col4 int; DECLARE @col5 smalldatetime; DECLARE @col6 bit; -- This table variable will store the data DECLARE @Dump TABLE ( col1 int, col2 varchar(50), col3 varchar(5), col4 int, col5 smalldatetime, col6 bit ) DECLARE @RowIter INT = 1; WHILE @RowIter <= @RowCount BEGIN DECLARE @QueryString NVARCHAR(MAX) = CONCAT(N'' SELECT @col1 = ID, @col2 = Name, @col3 = NameAbbr, @col4 = UpdatedBy, @col5 = DateUpdated, @col6 = Active FROM ( SELECT ROW_NUMBER() OVER (ORDER BY PKArea ASC) AS RowNum, * FROM EmployeesWeek_'',WEEK(GETDATE()),'' ) sq WHERE RowNum = '', @RowIter , '' ; ''); EXEC dbo.sp_executesql @QueryString, -- OUTPUT VARIABLE DECLARATION N'' @col1 int out, @col2 varchar(50) out, @col3 varchar(5) out, @col4 int out, @col5 smalldatetime out, @col6 bit out '', -- ALL OUTPUT VARIABLES @col1 out, @col2 out, @col3 out, @col4 out, @col5 out, @col6 out ; INSERT INTO @Dump values(@col1, @col2, @col3, @col4, @col5, @col6); SET @RowIter = @RowIter + 1; END SELECT * FROM @Dump;

Mi intuición dice que esto es potencialmente lento en grandes conjuntos de datos, y no sé si se puede hacer esta consulta dinámica (debería ser posible consultando la lista de nombres de columnas, usando hacks sucios para construir la cadena que contiene la lista de columnas , etc., pero por ahora no puedo dedicarle más tiempo a esto ...), lo que le permite seleccionar datos de una tabla con cualquier cantidad de columnas; pero de nuevo, esto es SQL ...