Невозможно переименовать столбец временной таблицы
Я создал глобальную временную таблицу, как это -
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';