存储过程中的sp_rename不起作用

时间:2014-04-23 07:56:55

标签: sql sql-server tsql stored-procedures

以下3个语句在连续执行时工作正常,但当我将它们包装在一个存储过程中时,我收到此错误消息:

  

Msg 207,Level 16,State 1,Line 10
  列名称“拆分”无效。
  Msg 207,Level 16,State 1,Line 9
  列名称“拆分”无效。

程序定义:

CREATE procedure [dbo].[dsplit_SITEL_update]
as
begin
   set nocount on;

   IF EXISTS(SELECT * FROM sys.columns 
             WHERE [name] = N'split_' AND [object_id] = OBJECT_ID(N'dsplit_SITEL$'))

       exec sp_rename @objname = N'dsplit_SITEL$.split_', 
                      @newname = 'split', 
                      @objtype = 'COLUMN';

   insert into dsplit_SITEL
      select 
          CONVERT(varchar(10), b.row_date, 120) + '_' + CONVERT(nvarchar(10), b.split), 
          b.*
      from dsplit_SITEL a 
      right join dsplit_SITEL$ b ON a.pk = CONVERT(varchar(10), b.row_date, 120) + '_' + CONVERT(nvarchar(10), b.split)
      where a.pk is null and b.row_date is not null;

    if OBJECT_ID('dsplit_SITEL$', 'U') is not null
       drop table dsplit_SITEL$;
END

这里发生了什么,如何让程序有效?

1 个答案:

答案 0 :(得分:1)

嗯,问题是在创建时SQL Server尝试将名称绑定到对象。如果表格目前不存在,那很好(它被称为延迟名称解析)。但是,如果该表存在但该列不存在,则该列将失败并且列名称无效'错误。

如果你使SQL动态化,你可以解决这个问题,至少是使用重命名列的部分,如下所示:

declare @s nvarchar(4000)
set @s = N'
    insert into dsplit_SITEL
    select 
        CONVERT(varchar(10), b.row_date, 120) + ''_'' + CONVERT(nvarchar(10), b.split), 
        b.*
    from dsplit_SITEL a 
    right join dsplit_SITEL$ b ON a.pk = CONVERT(varchar(10), b.row_date, 120) + ''_'' + CONVERT(nvarchar(10), b.split)
    where a.pk is null and b.row_date is not null;
'
exec (@s)