2

我正在尝试将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”,但未提供该参数。

4

2 回答 2

2

哦,我知道你在那里做了什么 -sp_rename程序需要 3 个参数 -

sp_rename [ @objname = ] 'object_name' , [ @newname = ] 'new_name'
[ , [ @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

于 2018-09-19T19:22:46.220 回答
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'
于 2018-09-19T19:27:31.733 回答