代码之家  ›  专栏  ›  技术社区  ›  msarchet

无论条件评估结果如何,都更改表的执行

  •  1
  • msarchet  · 技术社区  · 14 年前

    下面是一个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 present运行语句,SQL Server就会向我抛出这个错误。

    消息4927,级别16,状态1,行12 无法将列“lastChanged”更改为数据类型timestamp。

    问题不在于它不能更改数据类型。问题在于它试图执行该代码块,而不管条件的评估如何。

    2 回复  |  直到 14 年前
        1
  •  4
  •   Andomar    14 年前

    SQL Server在执行SQL之前对其进行分析。分析过程中出现错误。

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

    exec ('Alter Table [scriptassist].[RXINFO] Alter Column LastChanged TIMESTAMP')
    
        2
  •  2
  •   Joe Stefanelli    14 年前

    我相信您收到了这个错误,因为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] Drop Column LastChanged
          Alter Table [scriptassist].[RXINFO] Add LastChanged TimeStamp
         END