以下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
这里发生了什么,如何让程序有效?
答案 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)