【问题标题】:DIfferent Behavior in SQL 2008 R2 and SQL 2012SQL 2008 R2 和 SQL 2012 中的不同行为
【发布时间】:2012-09-13 03:20:51
【问题描述】:

当我尝试更新一些数据时

if Exists(select * from sys.columns where Name = N'Enabled' 
          and Object_ID = Object_ID(N'SLBPool'))
      begin
            update SLBPool set SLBPool.Enabled=1
      End
GO

它在 SQL 2012 中显示错误“Invalid column name 'Enabled'”,但是在 2008 R2 中没有发生 怎么来的?

【问题讨论】:

  • 错误似乎表明您的 SLBPool 表在您的 2012 数据库中没有名为 Enabled 的列。您绝对确定两个SLBPool 表的架构是相同的?
  • 可能系统视图上的架构发生了变化?排序规则或数据类型也可能有误。
  • 有没有可能Enabled在2012年是保留字,而在2008年不是?例如,您可以将列命名为Values,但您必须始终将其括在括号中,例如[Values]。和[Enabled]一样吗?
  • 这在 2008 年也应该是一个错误。编译包含此代码的批处理时,将编译 整个 批处理,并且缺少Enabled 列应该始终导致错误。我有兴趣查看一个重现脚本,它实际上可以按您的预期工作。
  • 对不起!重新产生错误为时已晚。我已经放下桌子并重新创建了一张新桌子,然后一切顺利。但是,我确定“已启用”列不存在!应该不会在 2012 年显示任何错误。感谢所有回复

标签: sql-server sql-server-2012


【解决方案1】:

这应该适用于任何版本的 SQL Server(当然可以追溯到 2000 年,IIRC)的唯一方法是,如果您在评估 if 条件之前阻止该语句被编译 - 这将指示动态 SQL:

if Exists(select * from sys.columns where Name = N'Enabled' 
          and Object_ID = Object_ID(N'SLBPool'))
      begin
            exec sp_executesql 'update SLBPool set SLBPool.Enabled=1'
      End
GO

【讨论】:

    【解决方案2】:

    这可能是因为服务器实例的排序规则,检查这是否有效,或产生其他错误:

    IF EXISTS(SELECT * FROM sys.columns WHERE name = N'Enabled' 
              AND object_id = OBJECT_ID(N'SLBPool'))
          BEGIN
                UPDATE SLBPool SET SLBPool.Enabled = 1
          END
    GO
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多