Невозможно переименовать столбец временной таблицы

Я создал глобальную временную таблицу, как это -

CREATE TABLE ##BigTable
(Nos varchar(10) null)

Затем попробуйте переименовать столбец Nos следующим образом:

EXEC sp_RENAME '##BigTable.Nos' , 'Numbers', 'COLUMN'

Я получил ошибку -

Either the parameter @objname is ambiguous or the 
claimed @objtype (COLUMN) is wrong.

Почему это может происходить и как мне решить проблему?



ДОПОЛНИТЕЛЬНЫЕ вещи не совсем связаны с вопросом, но для справки.

Я хочу добавить это - я попытался создать глобальную временную таблицу, используя полное имя, как это -

CREATE TABLE [NotMyTempDataBase].[dbo].[##BigTable]
(Nos varchar(10) null)

Затем я попытался переименовать его с помощью -

EXEC tempdb.sys.sp_rename N'[NotMyTempDataBase].[dbo].[##BigTable].Nos', 
N'Numbers', N'COLUMN';

Ошибка - квалифицированное @oldname ссылается на базу данных, отличную от текущей базы данных.

Это не верно. Я понял, что временная таблица создается в системной базе данных tempdb, даже если вы указали другое имя БД при ее создании.

используйте это вместо -

CREATE TABLE [tempdb].[dbo].[##BigTable]
(Nos varchar(10) null)

- Сообщение сервера базы данных: имя базы данных 'tempdb' игнорируется, ссылаясь на объект в базе данных tempdb.

EXEC tempdb.sys.sp_rename N'[tempdb].[dbo].[##BigTable].Nos', 
N'Numbers', N'COLUMN';

1 ответ

Решение

Итак, фактическое решение:

EXEC tempdb.sys.sp_rename N'##BigTable.Nos', N'Numbers', N'COLUMN';

Поскольку таблица #temp (даже глобальная временная таблица ##) находится в tempdbнужно вызвать sp_rename там.

Но дальнейшие вопросы для рассмотрения:

  • С какой стати вы используете глобальную временную таблицу ##? Вы знаете, что это эффективно ограничивает одновременность до ОДНОГО, верно? Как вы думаете, что произойдет, когда два пользователя вызовут этот код одновременно? Возможно, вы хотите использовать здесь временную таблицу #local или, возможно, вообще избегать использования таблиц #temp.

  • Почему у вас есть необходимость изменить имя столбца в середине сценария? Либо назовите его прямо во-первых, либо продолжайте ссылаться на старое имя. Как сценарий узнает, что вы изменили имя? С какой целью?

Кроме того, это сработало для меня. Это может быть полезно для кого-то

EXEC tempdb.sys.sp_rename N'#Tab1.Info', N'Numbers', N'COLUMN';
Другие вопросы по тегам