2011-09-26 43 views

Respuesta

6

Si está ejecutando esto desde una base de datos que no sea tempdb se obtiene

Ningún elemento con el nombre de '#tbl_tmp' se puede encontrar en la base de datos actual ....

Lo que no sorprende, ya que todas las páginas de datos, etc. están en los archivos de datos tempdb por lo tanto, no podría cambiar el nombre de este para convertirse repentinamente en una tabla permanente en otra base de datos.

Si está ejecutando esto desde tempdb se obtiene

Un parámetro u opción no válido se ha especificado para el procedimiento 'sys.sp_rename'.

Si lo hace EXEC sp_helptext sp_rename y mirar a la definición del bit correspondiente del código de no permitir esto es

-------------------------------------------------------------------------- 
-------------------- PHASE 32: Temporay Table Isssue ------------------- 
-------------------------------------------------------------------------- 
-- Disallow renaming object to or from a temp name (starts with #) 
if (@objtype = 'object' AND 
    (substring(@newname,1,1) = N'#' OR 
    substring(object_name(@objid),1,1) = N'#')) 
begin 
    COMMIT TRANSACTION 
    raiserror(15600,-1,-1, 'sys.sp_rename') 
    return 1 
end 

¿por qué no acaba de crear una tabla permanente en el primer lugar y luego hacer el cambio de nombre?

+0

Sí, me di cuenta de que para poder llamar a sp_rename, la tabla debe tener un object_id asociado, mientras que las tablas temporales no tienen uno. –

+1

@CoroveiAndrei - Lo hacen. Pruebe 'use tempdb; seleccione object_id ('# tbl_tmp') 'o de otro contexto de base de datos' select object_id ('tempdb .. # tbl_tmp') ' –

8

Por lo que sé, esto no es posible fuera de tempdb.

En lugar de cambiar el nombre de la tabla, puede crear una nueva desde la temporal.

No probado:

SELECT * 
INTO tbl_new 
FROM #tbl_tmp 
+0

sí, lo sé, pero estaba tratando de usar sp_rename. –

+0

@MartinSmith - Pero _hace_ darle una opción diferente. – Oded

+1

@MartinSmith - gracias por señalar mi error original. – Oded

2

#tbl_tmp y tbl_new son dos objetos diferentes: #tbl_tmp se almacena en tempdb base de datos del sistema y tbl_new se (por lo general) almacenada en una base de datos de usuario.

Así:

  1. Cambiar el nombre de una tabla temporal a una tabla estándar puede suponer la transferencia de ese objeto de base de datos fuente a otra base de datos.
  2. Cambiar el nombre de una tabla temporal a tabla estándar significa que desea convertir un objeto de un tipo a otro (en ambos casos, el type (de la vista sys.objects) es U, pero porque en SQL Server se comporta de manera diferente creo que es correcto considere que estos dos objetos tienen tipos diferentes). Es como convertir una tabla temporal en una variable de tabla al cambiar el nombre.

En ambos casos, no creo que sea posible hacer esta operación usando solo sp_rename.

0

La respuesta es Sí. Puede implementar algo parecido, pero de forma alternativa. Pruebe el siguiente enfoque, un poco de la vieja escuela, pero evita la restricción.Lo probé yo también

/* Create an empty temporary staging table **/ 
use aw_08r2 
go 
-- create temporary table 
select * into #temp from person.address 

-- select data from temporary staging table 
select * from #temp 

-- convert the temporary table and save as physical table in tempdb 
select * into tempdb.dbo.test from #temp 

-- save a copy of the physical table from tempdb in aw_08r2 
select * into person.test from tempdb.dbo.test 

-- select data from physical table 
select * from #temp 
select * from tempdb.dbo.test 
select * from person.test 

-- drop temporary table and physical table from tempdb 
drop table #temp 
drop table tempdb.dbo.test 
go 
Cuestiones relacionadas