Процедура sp_rename с именем столбца переменной - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь использовать хранимую процедуру 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 ]

0 голосов
/ 19 сентября 2018

Хранимая процедура sp_rename принимает 3 параметра, выполняя то, как вы используете вашу переменную. @NewName получает присвоение только первому параметру.

        EXEC [sys].[sp_rename] @objname = N''  -- nvarchar(1035)
                             , @newname = NULL -- sysname
                             , @objtype = ''   -- varchar(13)

Ваша переменная @NewName передается вas @ objname.

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

        EXEC [sys].[sp_rename] @objname = @TheObjectThatNeedsChange
                             , @newname = @TheNewName
                             , @objtype = 'COLUMN'
0 голосов
/ 19 сентября 2018

О, я вижу, что вы там сделали - процедура 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 для удобства чтения.

...