sp_rename具有可变列名的过程

时间:2018-09-19 19:08:22

标签: sql-server tsql variables rename sp-rename

由于我无法控制源(将列名更改为日期的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'。

2 个答案:

答案 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'