2011-10-27 148 views
1

我檢查表中是否存在列。如果存在,我根據第一個表中的列更新第二個表中的列。更新SQL Server 2005中的表列

問題是,更新在執行時不應執行並導致錯誤。

我在表Service_requests_details, 檢查Requested_by柱的存在,我再service_requests基於表Service_Requests_Detailsrequested_by列更新的列。

問題是,Requested_By可能不存在於表Service_requests_details

IF EXISTS (SELECT * FROM sys.columns WHERE Name = N'Requested_By' and object_ID = object_ID(N'Service_Requests_Details')) 
BEGIN 
     Update SR 
     Set SR.Requested_By = SRD.Requested_By 
     FROM Service_Requests SR 
     INNER JOIN Service_Requests_Details SRD ON SRD.Request_Index = SR.Service_Request_Index 
END 
GO 

更新:
謝謝大家誰回答。感謝@SqlAcid的答案。

+0

這是什麼回報? SELECT * FROM sys.columns WHERE Name = N'Requested_By'and object_ID = object_ID(N'Service_Requests_Details'。請記住,程序參數也保存在sys.columns中,您可以使用相同名稱的過程... – Sparky

+0

嘗試添加額外'U'給你object_id()(第二個參數是對象類型,加上'U'用於表) – Sparky

+0

正如Dylan所建議的,我對Information_Schema.columns進行了同樣的處理,並且遇到了同樣的問題 – AlwaysAProgrammer

回答

3

的問題是解析器仍然會評估您的更新聲明,即使在IF EXISTS爲false時也會失敗;你可以使用sp_executesql來解決它:

declare @sql nvarchar(1000) 
IF EXISTS (SELECT * FROM sys.columns WHERE Name = N'Requested_By' and object_ID = object_ID(N'Service_Requests_Details')) 
BEGIN 
    set @sql = 'Update SR 
     Set SR.Requested_By = SRD.Requested_By 
     FROM Service_Requests SR 
     INNER JOIN Service_Requests_Details SRD ON SRD.Request_Index = SR.Service_Request_Index' 
    exec sp_executesql @sql 
END 
GO 
2

這是我會做什麼在SQL 2008,沒有一個SQL 2005實例得心應手,看看它在那裏,但值得一試:

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'Service_Requests_Details' AND COLUMN_NAME = 'Requested_By') 
BEGIN 
    ... 
END 
+0

謝謝Dylan的回答,但不起作用。 – AlwaysAProgrammer

+1

這應該在SQL 2005中工作...檢查鏈接:http://msdn.microsoft.com/en-us/library/ms188348(v=SQL.90).aspx – Sparky