以下是我用于在必要时将表更新为正确数据类型的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并确定是否所有代码路径都可以执行,并且因为它们不能抛出错误。然而,这并没有多大意义。
答案 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