2014-04-23 26 views
0

3個下面的語句正常工作,但是當我裹着他們在一個存儲過程,我收到此錯誤信息:sp_rename存儲過程中不能正常工作時,連續執行

消息207,級別16,狀態1,第10行
無效的列名'split'。
消息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 

這到底是怎麼回事,我怎麼能有程序的工作?

+0

也許不是重點,但你爲什麼不只是使用的列如果您打算在程序結束時刪除整個表格,那麼它的名稱不會修改? –

+0

事情是我使用dsplit_SITEL $作爲臨時表來更新主dsplit_SITEL。問題是,有時候他們發送帶有不正確的列名稱的尾部下劃線:'split_'而不是'split' – Maju

+0

這應該不重要。 INSERT ... SELECT的'SELECT'子句中的列名不會用於任何事情,而且您正在使用'SELECT *',因此任何一個表都可以工作。 –

回答

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) 
+0

感謝您對Dean的評論。你能爲這種情況建議這樣一個動態的SQL嗎? – Maju

+0

請參閱已編輯的答案。 – dean

+0

是的,這是有效的。雖然在執行實際的代碼之前引擎會拋出一個錯誤,這在我們看來仍然很奇怪,而實際的代碼最終是正確的。 – Maju