【发布时间】:2011-10-27 21:49:08
【问题描述】:
我检查表中是否存在列。如果存在,我会根据第一个表中的列更新第二个表中的列。
问题是,更新在不应该执行的时候执行并导致错误。
我在表Service_requests_details 中检查列Requested_by 的存在,
然后,我根据表Service_Requests_Details 中的列requested_by 更新service_requests 中的列。
关键是,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 的回答。
【问题讨论】:
-
这会返回什么? SELECT * FROM sys.columns WHERE Name = N'Requested_By' and object_ID = object_ID(N'Service_Requests_Details'。记住,过程的参数也保存在 sys.columns 中,你可以有同名的过程......
-
尝试在你的 object_id() 中添加额外的 'U' (第二个参数是对象类型,添加 'U' 用于表格)
-
按照 Dylan 的建议,我对 Information_Schema.columns 进行了同样的尝试,但遇到了同样的问题
-
一般来说,这是一个非常糟糕的主意;表上的列应该被认为是它们所代表的实体的固定属性。话虽这么说,你得到的错误到底是什么?我的猜测是您的脚本不会通过优化器检查,因为您尝试从不存在的列进行更新
-
@StuartAinsworth:更新是 1 次更新,之后需要从另一个表中删除该列。所以我们只是想确保脚本在多次运行时能够成功执行。
标签: sql sql-server-2005