Gestion de tablas locales ('#') - TEMPDB

21/11/2007 - 15:42 por Fernando Mosquera Catarecha | Informe spam
Buenos días a todos!



Se me planteo la siguiente problemática:



Como es sabido, cuando un usuario crea una tabla temporal local (con el
signo '#') esta se almacena en el contendor TEMPDB de nuestro motor de SQL.
Hasta que el usuario no realiza un DROP de la misma o no cierra la conexión
dicha tabla no es eliminada.



Ahora bien:



Como puedo eliminar dicha tabla?

Como puedo realizarle un SELECT de la misma?

Como puedo saber que conexión la esta manteniendo?



Realice toda clase de pruebas / scripts involucrando el object id, name,
tablas del sistema, etc. y no puede obtener resultados positivo.



No puedo concebir que siendo sysadmin no pueda tener gestión sobre dichas
tablas.



Si alguien ya se planteo esta problemática o tiene una solución que yo
ignoro le agradecería que conteste el Post.



Saludos Cordiales,

Atte.

Fernando.

Preguntas similare

Leer las respuestas

#1 jcac
21/11/2007 - 15:47 | Informe spam
Solo como dato informativo las tablas temporales de # solo se crean por
sesión, es decir que si una sesión crea una tabla #tmp y otra sesión crea la
table #tmp estas serán distintas, ya que he visto que las crea como
#tmp___________________________________<codificacion adicional> dentro de la
TempDB.

No se si eso es lo que te confunda pero bueno solo como dato informativo

Saludos

"Fernando Mosquera Catarecha" escribió en el
mensaje news:OAT$
Buenos días a todos!



Se me planteo la siguiente problemática:



Como es sabido, cuando un usuario crea una tabla temporal local (con el
signo '#') esta se almacena en el contendor TEMPDB de nuestro motor de
SQL. Hasta que el usuario no realiza un DROP de la misma o no cierra la
conexión dicha tabla no es eliminada.



Ahora bien:



Como puedo eliminar dicha tabla?

Como puedo realizarle un SELECT de la misma?

Como puedo saber que conexión la esta manteniendo?



Realice toda clase de pruebas / scripts involucrando el object id, name,
tablas del sistema, etc. y no puede obtener resultados positivo.



No puedo concebir que siendo sysadmin no pueda tener gestión sobre dichas
tablas.



Si alguien ya se planteo esta problemática o tiene una solución que yo
ignoro le agradecería que conteste el Post.



Saludos Cordiales,

Atte.

Fernando.


Respuesta Responder a este mensaje
#2 Salvador Ramos
21/11/2007 - 16:17 | Informe spam
Hola,

No se si entiendo bien tu pregunta, te paso un script muy simple donde se vé
como se crea una tabla temporal local, se insertan datos, se consultan y
luego se borra la tabla.

create table #temporal(id int identity(1, 1), nombre varchar(30))
GO
insert into #temporal values('pepe')
insert into #temporal values('juan')
GO
select * from #temporal
GO
drop table #temporal
GO

Si no es esto lo que necesitas, nos comentas.

Un saludo
Salvador Ramos

www.helpdna.net (información sobre SQL Server y Microsoft .Net)
www.helpdna.net/acerca_de_salvador_ramos.htm


"Fernando Mosquera Catarecha" escribió en el
mensaje news:OAT$
Buenos días a todos!



Se me planteo la siguiente problemática:



Como es sabido, cuando un usuario crea una tabla temporal local (con el
signo '#') esta se almacena en el contendor TEMPDB de nuestro motor de
SQL. Hasta que el usuario no realiza un DROP de la misma o no cierra la
conexión dicha tabla no es eliminada.



Ahora bien:



Como puedo eliminar dicha tabla?

Como puedo realizarle un SELECT de la misma?

Como puedo saber que conexión la esta manteniendo?



Realice toda clase de pruebas / scripts involucrando el object id, name,
tablas del sistema, etc. y no puede obtener resultados positivo.



No puedo concebir que siendo sysadmin no pueda tener gestión sobre dichas
tablas.



Si alguien ya se planteo esta problemática o tiene una solución que yo
ignoro le agradecería que conteste el Post.



Saludos Cordiales,

Atte.

Fernando.


Respuesta Responder a este mensaje
#3 Maxi Accotto
21/11/2007 - 16:37 | Informe spam
Hola amigo, lamento decirte que no es correcto lo que estas comentando :(,
tablas temporales hay 2 (globales y locales) las primeras se identifican por
usar ## y las segundas por uno #, pero, estas ultimas NO estan vivas durante
una sesion sino que en un alcance determinado (por ejemplo lo que viva un
Store), las segundas si viven durante toda la sesion.
Aqui expongo un ejemplo para demostrar lo que comento:

USE NORTHWIND
GO

CREATE PROC USP_1 AS
CREATE TABLE #T1 (ID INT)
INSERT INTO #T1 VALUES (1)
SELECT * FROM #T1
GO

EXEC USP_1
SELECT * FROM #T1 -- FALLA

CREATE PROC USP_2 AS
CREATE TABLE ##T2 (ID INT)
INSERT INTO ##T2 VALUES (1)
SELECT * FROM ##T2
GO

EXEC USP_2
SELECT * FROM ##T2 -- NO FALLA



Microsoft MVP SQLServer
www.sqltotalconsulting.com
-

"jcac" escribió en el mensaje de
noticias:
Solo como dato informativo las tablas temporales de # solo se crean por
sesión, es decir que si una sesión crea una tabla #tmp y otra sesión crea
la table #tmp estas serán distintas, ya que he visto que las crea como
#tmp___________________________________<codificacion adicional> dentro de
la TempDB.

No se si eso es lo que te confunda pero bueno solo como dato informativo

Saludos

"Fernando Mosquera Catarecha" escribió en el
mensaje news:OAT$
Buenos días a todos!



Se me planteo la siguiente problemática:



Como es sabido, cuando un usuario crea una tabla temporal local (con el
signo '#') esta se almacena en el contendor TEMPDB de nuestro motor de
SQL. Hasta que el usuario no realiza un DROP de la misma o no cierra la
conexión dicha tabla no es eliminada.



Ahora bien:



Como puedo eliminar dicha tabla?

Como puedo realizarle un SELECT de la misma?

Como puedo saber que conexión la esta manteniendo?



Realice toda clase de pruebas / scripts involucrando el object id, name,
tablas del sistema, etc. y no puede obtener resultados positivo.



No puedo concebir que siendo sysadmin no pueda tener gestión sobre dichas
tablas.



Si alguien ya se planteo esta problemática o tiene una solución que yo
ignoro le agradecería que conteste el Post.



Saludos Cordiales,

Atte.

Fernando.






Respuesta Responder a este mensaje
#4 Fernando Mosquera Catarecha
21/11/2007 - 16:56 | Informe spam
Gente, ante todo muchas gracias por sus respuestas.



Técnicamente sus comentarios son correctos pero no estaría aplicando a mi
consulta. Les doy un caso práctico a fin de aportar claridad.



El usuario 'Pepe' se conecta al SQL con un "Query Analyzer", crea una tabla
temporal local (con el signo '#') y la alimenta con 10 millones de registros
(char (200)).

Termina el horario laborar y el usuario 'Pepe' se va a su casa dejando la PC
"bloqueada" con el "Query Analyzer" abierto (obviamente manteniendo la
conexión PID X con su respectiva tabla temporal de 10 millones de
registros).



Yo administrador del SQL visualizo que el contenedor TEMPDB creció
desmesuradamente y me pongo a analizar el porque.

Rápidamente encuentro una tabla llamada '#TmpPepe____________________XXXXXX'
la cual me esta llenando el contenedor.

Ahora bien, la quiero borrar (DROP) y no puedo, la quiero consultar y
tampoco puedo. Alternativa: Tendría que identificar la conexión que la
mantiene y realizar un simple KILL al PID para que la misma sea eliminada
automáticamente por el SQL pero no tengo forma de ver cual es ese PID.



Con las tablas del sistema no pude precisar nada.



Lindo problema, no?



Es más común de lo que parece cuando se trabaja en ambientes de desarrollo.



Agradezco sus colaboraciones,

Saludos Cordiales,

Atte.

Fernando.



"Fernando Mosquera Catarecha" wrote in message
news:OAT$
Buenos días a todos!



Se me planteo la siguiente problemática:



Como es sabido, cuando un usuario crea una tabla temporal local (con el
signo '#') esta se almacena en el contendor TEMPDB de nuestro motor de
SQL. Hasta que el usuario no realiza un DROP de la misma o no cierra la
conexión dicha tabla no es eliminada.



Ahora bien:



Como puedo eliminar dicha tabla?

Como puedo realizarle un SELECT de la misma?

Como puedo saber que conexión la esta manteniendo?



Realice toda clase de pruebas / scripts involucrando el object id, name,
tablas del sistema, etc. y no puede obtener resultados positivo.



No puedo concebir que siendo sysadmin no pueda tener gestión sobre dichas
tablas.



Si alguien ya se planteo esta problemática o tiene una solución que yo
ignoro le agradecería que conteste el Post.



Saludos Cordiales,

Atte.

Fernando.


Respuesta Responder a este mensaje
#5 Fernando Mosquera Catarecha
21/11/2007 - 17:14 | Informe spam
Estimado Maxi,

Es correcta tu apreciación, sinceramente peco por no explayarme tanto en
tecnicismo, agradezco tus comentarios.

Se te ocurre alguna idea que aporte claridad a mi problema?



Muchas gracias,

Atte.

Fernando.


"Maxi Accotto" wrote in message
news:
Hola amigo, lamento decirte que no es correcto lo que estas comentando :(,
tablas temporales hay 2 (globales y locales) las primeras se identifican
por usar ## y las segundas por uno #, pero, estas ultimas NO estan vivas
durante una sesion sino que en un alcance determinado (por ejemplo lo que
viva un Store), las segundas si viven durante toda la sesion.
Aqui expongo un ejemplo para demostrar lo que comento:

USE NORTHWIND
GO

CREATE PROC USP_1 AS
CREATE TABLE #T1 (ID INT)
INSERT INTO #T1 VALUES (1)
SELECT * FROM #T1
GO

EXEC USP_1
SELECT * FROM #T1 -- FALLA

CREATE PROC USP_2 AS
CREATE TABLE ##T2 (ID INT)
INSERT INTO ##T2 VALUES (1)
SELECT * FROM ##T2
GO

EXEC USP_2
SELECT * FROM ##T2 -- NO FALLA



Microsoft MVP SQLServer
www.sqltotalconsulting.com
-

"jcac" escribió en el mensaje de
noticias:
Solo como dato informativo las tablas temporales de # solo se crean por
sesión, es decir que si una sesión crea una tabla #tmp y otra sesión crea
la table #tmp estas serán distintas, ya que he visto que las crea como
#tmp___________________________________<codificacion adicional> dentro de
la TempDB.

No se si eso es lo que te confunda pero bueno solo como dato informativo

Saludos

"Fernando Mosquera Catarecha" escribió en el
mensaje news:OAT$
Buenos días a todos!



Se me planteo la siguiente problemática:



Como es sabido, cuando un usuario crea una tabla temporal local (con el
signo '#') esta se almacena en el contendor TEMPDB de nuestro motor de
SQL. Hasta que el usuario no realiza un DROP de la misma o no cierra la
conexión dicha tabla no es eliminada.



Ahora bien:



Como puedo eliminar dicha tabla?

Como puedo realizarle un SELECT de la misma?

Como puedo saber que conexión la esta manteniendo?



Realice toda clase de pruebas / scripts involucrando el object id, name,
tablas del sistema, etc. y no puede obtener resultados positivo.



No puedo concebir que siendo sysadmin no pueda tener gestión sobre
dichas tablas.



Si alguien ya se planteo esta problemática o tiene una solución que yo
ignoro le agradecería que conteste el Post.



Saludos Cordiales,

Atte.

Fernando.






Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida