2011-10-27 109 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