由于我无法控制源(将列名更改为日期的Excel文件),因此我尝试将sp_rename
存储过程与变量一起使用。
我放一个表,然后导入该表。然后,我想更改该表的列名,因此我使用模式查询来找出当前的列,以便可以使用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
我在第一个代码集上遇到的错误是
Msg 201,级别16,状态4,过程sp_rename,第0行[批处理开始第2行]
过程或函数'sp_rename'需要未提供的参数'@newname'。
答案 0 :(得分: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
。
答案 1 :(得分:2)
通过以您自己的变量@NewName的方式执行,存储过程sp_rename可以使用3个参数。
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'