【问题标题】:sp_rename in stored procedure does not work存储过程中的 sp_rename 不起作用
【发布时间】:2014-04-23 07:56:54
【问题描述】:

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

消息 207,第 16 级,状态 1,第 10 行
列名“拆分”无效。
消息 207,第 16 层,状态 1,第 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

这里发生了什么,我怎样才能使程序正常工作?

【问题讨论】:

  • 也许不是重点,但如果您打算在程序结束时删除整个表,为什么不直接使用未修改名称的列?
  • 问题是我使用 dsplit_SITEL$ 作为临时表只是为了更新主 dsplit_SITEL。问题是,有时他们发送的表格带有不正确的列名并带有尾随下划线:'split_' 而不是 'split'
  • 没关系。 INSERT...SELECTSELECT 子句中的列名不用于任何用途,而您使用的是 SELECT *,因此任一表都可以工作。
  • Te OP 正在加入 split 列。
  • 我用 [split] 做一个主键字段:...CONVERT(nvarchar(10), b.split)

标签: sql sql-server tsql stored-procedures


【解决方案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)

【讨论】:

  • 感谢 cmets 院长。您能为这种情况推荐这样一个动态 SQL 吗?
  • 是的,这行得通。虽然在我看来引擎在执行最终正确的实际代码之前抛出错误仍然很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
相关资源
最近更新 更多