¿Puedo hacer algo como esto?renombrar una tabla temporal en una física
create table #tbl_tmp (col1 int)
insert into #tbl_tmp select 3
exec sp_rename '#tbl_tmp','tbl_new'
¿Puedo hacer algo como esto?renombrar una tabla temporal en una física
create table #tbl_tmp (col1 int)
insert into #tbl_tmp select 3
exec sp_rename '#tbl_tmp','tbl_new'
Nº
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?
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
#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í:
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
.
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
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. –
@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') ' –