2012-01-18 23 views
5

Estoy utilizando Oracle 11g tablas temporales globales, ya que necesito una solución en la que puedo agregar filas a una tabla temporal para una unión, y quiero sólo las filas añaden a la tabla temporal para el Oracle Connection/session para ser incluido. Estoy usando Global Temp Table en Oracle porque quiero que la tabla exista entre sesiones para que no tenga que volver a crearla cada vez que creo una consulta. Esto está funcionando bien.tablas temporales globales - SQL Server vs Oracle

Mi definición de la tabla de Oracle es el siguiente:

CREATE GLOBAL TEMPORARY TABLE book_id_temp 
( 
    book_id RAW(32) 
)ON COMMIT DELETE ROWS; 

que tienen la misma estructura de base de datos también en el lado 2008-R2 SQL Server, y necesitan una solución similar en SQL Server. Quiero:

  1. abrir una conexión SQL (ADO.NET)
  2. dentro de una transacción:
  3. filas -Añadir a una tabla temporal.
  4. -Júralos en otra tabla, SELECCIONE los resultados
  5. -Solo incluya las filas agregadas durante esta sesión en la unión. Otro hilo puede estar ejecutándose en la misma tabla temporal. ¿Es posible entonces que una tabla de temperatura local sea la mejor aquí?
  6. Rollback toda la transacción.

Por lo que he leído de tablas temporales globales en SQL Server, existen las tablas después de que se puso fin a una relación, como una mesa normal, y como una tabla temporal global en Oracle. Sin embargo, no está claro el alcance de los datos. ¿Solo la sesión de SQL Server que creó las filas tiene acceso a ella, como en Oracle? ¿Cuál es la accesibilidad de los datos con SQL Server Global Temp Tables? ¿Tienes una sugerencia de una alternativa para lograr mi objetivo?

+0

Las tablas de Oracle Global Temp también se deben truncar, dependiendo de la operación ... Usaría una variable de tabla sobre una tabla temporal en SQL Server dada la opción, pero se necesita explique su necesidad de persistencia cuando la conexión se pierde para obtener ayuda real. ¿Por qué no solo hacer una tabla real? –

+0

Quiero que la tabla exista entre sesiones para que no tenga que volver a crearla cada vez que creo una consulta. –

+0

Suena * como si quisiera una tabla temporal local, en lugar de una tabla temporal global. ¿Podría describir qué semántica * necesita *? –

Respuesta

6

Las tablas temporales en Oracle son objetos permanentes que contienen datos temporales que son sesión local. Las tablas temporales en SQL Server son objetos temporales.

  1. En SQL Server, una tabla global de temperatura contiene datos que son visibles para todas las sesiones. "Las tablas temporales globales son visibles para cualquier usuario y cualquier conexión después de su creación". http://msdn.microsoft.com/en-us/library/ms186986.aspx
  2. Las tablas temporales globales siguen siendo objetos temporales que no persisten indefinidamente y es posible que deban crearse antes de su uso. "Las tablas temporales globales se ... eliminan cuando todos los usuarios que hacen referencia a la tabla se desconectan de la instancia de SQL Server". http://msdn.microsoft.com/en-us/library/ms186986.aspx

me parece que una tabla temporal local o variable de tabla, es el más cercano a ser la misma a tabla temporal global de Oracle, la gran diferencia es que hay que crear cada vez.

Por lo general, en un caso como el suyo, el paso 3, añadir filas de tabla temporal, se llevaría a cabo haciendo una select ... into #temp_table_name .... (equivalente a Oracle create table ... as select ...) http://msdn.microsoft.com/en-us/library/ms188029.aspx

Además, no se puede hacer lo siguiente en una proc almacenado: (pseudo código.)

begin proc 
    call another proc to create local temp table. 
    use temp table 
end proc 

tablas temporales locales son destruidos al regresar del procedimiento almacenado que los creó.

Actualización 2014-10-14: El comportamiento de las tablas temporales locales es diferente en la versión de Parallel Data Warehousev de SQL Server. Las tablas temporales no se eliminan al salir del procedimiento almacenado que las creó, sino que continúan existiendo durante el resto de la sesión. Este comportamiento se observó en:

select @@version 
Microsoft SQL Server 2012 - 10.0.5108.1 (X64) Jun 24 2014 20:17:02 Copyright (c) Microsoft Corporation Parallel Data Warehouse (64-bit) on Windows NT 6.2 <X64> (Build 9200:) 
1

Si crea manualmente las tablas de la base de datos tempdb, que acheive más o menos el mismo efecto:

USE tempdb; 

CREATE TABLE foo... 

y luego dirigirse a ellos:

select * from tempdb..foo 

Estas tablas no se eliminarán entre sesiones . Sin embargo, debe truncarlos manualmente, sin equivalente a ON COMMIT DELETE ROWS.

+0

Mi implementación actual de ADO.NET es que después de insertar registros en la tabla temporal y hacer la unión, hago una restauración() en el IDbConnection, por lo que en realidad puede ser suficiente. Usted dice que la tabla no se eliminará, pero ¿qué pasa con su contenido? Estoy pensando que, si nunca estoy comprometiendo la transacción, ninguna otra conexión activa podría acceder a los datos –

+0

Funcionará, pero es increíblemente ineficiente. Los rollbacks en SQL Server son muy propensos a bloqueos y lentos, especialmente para datos de gran tamaño. Mucho más eficiente es usar tablas temporales a nivel de sesión o si insistes en tener una tabla global, truncarla una vez que hayas terminado. –

1

Si crea una tabla global de temperatura (## tabla) en SQL Server será 'en vivo' y ser accesible a través de otras sesiones hasta que la sesión se cierra. Además, no podrá crear esa tabla global de temperatura con el mismo nombre para una sesión diferente hasta que se cierre la sesión original, verá que la tabla ya existe. Para su propósito, una tabla Global Temp no sería una buena solución.

una tabla temporal local (#table) sería mucho mejor y logrará lo que busca hacer.

Esperanza esto ayuda

+0

¿los registros de una tabla temporal global solo son accesibles dentro de la transacción en la que se crearon? Prefiero no tener que crear la tabla de cada consulta. –

+0

No, los registros en las tablas temporales globales de SQL Server (## table_name) son visibles para todas las sesiones. –

4

tablas temporales en SQL Server son local de forma predeterminada. La tabla se eliminará después de que termine la sesión. Si se ejecuta una secuencia de comandos como:

create table #Foo (
     FooID int 
     ,FooCode1 varchar (20) 
) 

insert table #Foo (FooID, FooCode1) 
values (1001, 'X') 

insert table #Foo (FooID, FooCode1) 
values (1002, 'Y') 

select f.FooID 
     ,f.FooCode1 
     ,b.BarID 
     ,b.BarCode1 
    from #foo f 
    join bar b 
    on bar.FooID = f.FooID -- (or whatever predicate) 

La consulta sólo devolverá filas que se unen en lo que ha insertado en #foo en esta sesión. #Foo es local para la sesión; puede tener varias sesiones con su propia tabla temporal #Foo sin preocupaciones sobre colisiones de espacios de nombres.Cuando la sesión se cierra, la tabla temporal será descartada. También puede soltar explícitamente #Foo después de haber terminado con él si está utilizando una conexión de base de datos persistente (por ejemplo, una aplicación de escritorio cliente-servidor).

+0

Creo un IDbConnection y administro la transacción (no persistente) y cierro la conexión. Cuando la conexión se cierra, también lo hace la sesión, ¿correcto? –

+0

Sí, si cierra la conexión, la sesión se cerrará. – ConcernedOfTunbridgeWells

Cuestiones relacionadas