更新 SQL Server 2005 中的表列
Posted
技术标签:
【中文标题】更新 SQL Server 2005 中的表列【英文标题】:Update a table column in SQL Server 2005 【发布时间】: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 次更新,之后需要从另一个表中删除该列。所以我们只是想确保脚本在多次运行时能够成功执行。 【参考方案1】:问题是解析器仍然会评估您的更新语句并且即使在 IF EXISTS 为假时也会失败;你可以使用 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
【讨论】:
这应该在 SQL 2005 中工作...检查链接:msdn.microsoft.com/en-us/library/ms188348(v=SQL.90).aspx以上是关于更新 SQL Server 2005 中的表列的主要内容,如果未能解决你的问题,请参考以下文章
如何实现 OPENJSON 将 JSON 代码作为列中的文本。如何在 AZURE SQL Dataware House 中的表列上使用 OPENJSON?