Процедура sp_rename с именем столбца переменной
Я пытаюсь использовать sp_rename
хранимая процедура с переменной, так как у меня нет контроля над источником (файл Excel, который меняет имя столбца, чтобы иметь дату).
Я удаляю таблицу, а затем импортирую эту таблицу. Затем я хочу изменить имя столбца этой таблицы, чтобы использовать запрос схемы, чтобы выяснить, какой столбец находится в данный момент, чтобы я мог изменить его с помощью sp_rename
:
USE ESS
GO
DECLARE @TotalName NVARCHAR(255)
DECLARE @ColName NVARCHAR(255)
DECLARE @NewName NVARCHAR(255)
SELECT
@ColName = column_name
FROM
information_schema.columns
WHERE
TABLE_SCHEMA = 'dbo'
AND TABLE_NAME = 'serverinv_unix_system_assignments_staging'
AND ordinal_position = 1;
SET @TotalName = CONCAT(N'dbo.serverinv_unix_system_assignements_staging.' ,@ColName)
SET @NewName = ''''+ @TotalName+ ''','''+''+'server_name'+''','''+'COLUMN'';'+''
-- Select @NewName
EXEC sp_rename @NewName
Это работает, если я явно наберу его, как показано ниже.
USE ESS
GO
EXEC sp_rename 'dbo.serverinv_unix_system_assignments_staging.Hostname as of 8/26/2018','server_name','COLUMN';
GO
Ошибка, которую я получаю в первом наборе кодов:
Сообщение 201, Уровень 16, Состояние 4, Процедура sp_rename, Строка 0 [Стартовая Строка 2]
Процедура или функция sp_rename ожидает параметр @newname, который не был предоставлен.
2 ответа
Хранимая процедура sp_rename принимает 3 параметра, выполняя то, как вы используете вашу переменную. @NewName получает присвоение только первому параметру.
EXEC [sys].[sp_rename] @objname = N'' -- nvarchar(1035)
, @newname = NULL -- sysname
, @objtype = '' -- varchar(13)
Ваша переменная @NewName передается как @objname.
Я думаю, что если немного изменить свой код, вы получите желаемый результат. Определите каждый параметр в своей собственной переменной и передайте каждый из них при выполнении хранимой процедуры.
EXEC [sys].[sp_rename] @objname = @TheObjectThatNeedsChange
, @newname = @TheNewName
, @objtype = 'COLUMN'
О, я вижу, что ты там сделал - sp_rename
процедура ожидает 3 параметра -
sp_rename [@objname =] 'имя_объекта', [ @newname = ] 'новое_имя'
[, [@objtype =] 'object_type']
но вы передаете один параметр, который содержит 3 значения, разделенных запятыми.
Это не будет работать. Вместо того, чтобы объединить всю информацию в один параметр, вам нужно передать 3 параметра в хранимую процедуру:
SET @OldName = CONCAT(N'dbo.serverinv_unix_system_assignements_staging.' ,@ColName)
EXEC sp_rename @OldName, 'server_name', 'COLUMN'
(Обратите внимание, что я переименовал @TotalName
в @OldName
ради читабельности.