ALTER TABLE执行与条件评估结果无关

时间:2010-10-25 18:41:13

标签: sql-server

以下是我用于在必要时将表更新为正确数据类型的SQL查询的摘录。

If NOT Exists(Select * From Information_Schema.Columns 
    Where Table_Name = N'RXINFO'
    And Table_Schema = N'scriptassist' 
    And Column_Name = N'LastChanged'    
    And DATA_Type = N'TIMESTAMP' 
    AND IsNull(CHARACTER_MAXIMUM_LENGTH, 0) = 0)
     BEGIN
      Print 'LastChanged Field  needed type updating'
      Alter Table [scriptassist].[RXINFO] Alter Column LastChanged TIMESTAMP
     END

目前问题如下:

如果我运行语句使用Alter Table,SQL Server会向我抛出此错误。

  

Msg 4927,Level 16,State 1,Line 12   无法将列'LastChanged'更改为数据类型时间戳。

问题不在于它无法更改数据类型问题在于它正在尝试执行该代码块而不管条件的评估。 在这种情况下,它应该评估为False。

如果我把它拿出来,没有任何反应,打印声明甚至不会发射。

到目前为止,我唯一能想到的是MS SQL不知何故事先评估SQL并确定是否所有代码路径都可以执行,并且因为它们不能抛出错误。然而,这并没有多大意义。

2 个答案:

答案 0 :(得分:4)

SQL Server在执行SQL之前解析它。解析期间会引发错误。

要延迟解析直到实际运行该行,请使用exec:

exec ('Alter Table [scriptassist].[RXINFO] Alter Column LastChanged TIMESTAMP')

答案 1 :(得分:2)

我相信您收到此错误是因为SQL无法执行从TimeStamp列的先前数据类型到实际TimeStamp数据类型的转换。您需要删除然后添加列。

If NOT Exists(Select * From Information_Schema.Columns 
    Where Table_Name = N'RXINFO'
    And Table_Schema = N'scriptassist' 
    And Column_Name = N'LastChanged'    
    And DATA_Type = N'TIMESTAMP' 
    AND IsNull(CHARACTER_MAXIMUM_LENGTH, 0) = 0)
     BEGIN
      Print 'LastChanged Field  needed type updating'
      Alter Table [scriptassist].[RXINFO] Drop Column LastChanged
      Alter Table [scriptassist].[RXINFO] Add LastChanged TimeStamp
     END