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

Я создал глобальную таблицу temp, подобную этой -

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.

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

EXTRA, не совсем связанный с вопросом, но для справки.

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

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)

- сообщение сервера SQL: имя базы данных "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 (даже глобальная таблица temp ##) находится в tempdb, вам нужно вызвать там sp_rename.

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

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

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

licensed under cc by-sa 3.0 with attribution.