更新 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 中的表列的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 的表列中使用 UDF 作为默认值

替换SQL Server表列中的文本

如何实现 OPENJSON 将 JSON 代码作为列中的文本。如何在 AZURE SQL Dataware House 中的表列上使用 OPENJSON?

SQL Server 表列的条件更新

在 SQL Server 2000/2005 中更新表的工具

如何存储和调用表列中的 sql 查询?