переименование временной таблицы в физическую - PullRequest
8 голосов
/ 26 сентября 2011

Могу ли я сделать что-то подобное?

create table #tbl_tmp (col1 int)

insert into #tbl_tmp select 3

exec sp_rename '#tbl_tmp','tbl_new'

Ответы [ 4 ]

9 голосов
/ 26 сентября 2011

Насколько я знаю, это невозможно за пределами tempdb.

Вместо того, чтобы переименовывать таблицу, вы можете создать новую из временной.

Не проверено:

SELECT * 
INTO tbl_new
FROM #tbl_tmp
8 голосов
/ 26 сентября 2011

номер

Если вы запускаете это из базы данных, отличной от tempdb, вы получите

Ни один элемент с именем '#tbl_tmp' не найден в текущем база данных ....

Что неудивительно, поскольку все страницы данных и т. Д. Находятся в файлах данных tempdb, поэтому вы не сможете переименовать это, чтобы внезапно стать постоянной таблицей в другой базе данных.

Если вы запускаете это с tempdb, вы получите

Для процедуры указан недопустимый параметр или опция 'Sys.sp_rename'.

Если вы сделаете EXEC sp_helptext sp_rename и посмотрите на определение, соответствующий бит кода, запрещающий это

--------------------------------------------------------------------------  
 --------------------  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  

Почему бы вам сначала не создать постоянную таблицу, а затем переименовать?

2 голосов
/ 26 сентября 2011

#tbl_tmp и tbl_new - два разных объекта: #tbl_tmp хранится в системной базе данных tempdb, а tbl_new (обычно) хранится в пользовательской базе данных.

Итак:

  1. Переименование временной таблицы в стандартную таблицу может предполагать перенос этого объекта из исходной базы данных в другую базу данных.
  2. Переименование временной таблицы в стандартную таблицу означает, что вы хотите преобразовать объект из одного типа в другой тип (в обоих случаях type (из представления sys.objects) имеет значение U, но потому что в SQL Server ведут себя иначе я считаю правильным считать, что эти два объекта имеют разный тип). Это похоже на преобразование временной таблицы в переменную таблицы путем переименования.

В обоих случаях я не думаю, что возможно выполнить эту операцию, используя только sp_rename.

0 голосов
/ 02 июня 2013

Ответ - да. Вы можете реализовать что-то подобное, но обходным путем. Попробуйте следующий подход: немного старая школа, но обходит ограничение. Я тоже это проверил

/* 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...