2010-10-25 13 views
1

下面是一个SQL查询的摘录,我正在使用它将表更新为正确的数据类型(如果需要)。ALTER TABLE执行而不考虑条件评估结果

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在我抛出这个错误。

消息4927,级别16,状态1,行12 无法将列'LastChanged'更改为数据类型时间戳。

问题不是它不能改变数据类型问题是它试图执行那个代码块而不管条件的评估。 在这种情况下,它应该评估为False。

如果我把它拿出来,什么都不会发生,印刷声明甚至不会引发火灾。

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

+0

在SQL Server 2008 R2上运行相同的代码时,我没有收到任何错误。 你说它*应该*评估为false。您是否将您的选择标准拉出以确保它返回结果? – 2010-10-25 18:55:45

+0

@mootinator,是的,我做到了。 – msarchet 2010-10-25 18:57:30

回答

4

SQL Server在执行它之前会解析您的SQL。分析过程中出现错误。

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

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

完美谢谢。 – msarchet 2010-10-25 18:54:08

+0

我刚测试过这个,你仍然会得到同样的错误。请参阅[我的答案](http://stackoverflow.com/questions/4017731/alter-table-executing-regardless-of-condition-evaluational-results/4017902#4017902)。 – 2010-10-25 19:04:49

+0

@Joe Stefanelli说得很好。 Exec()解决方案可防止ALTER COLUMN代码在不应运行时进行评估。 BOL说ALTER列“type_name不能是时间戳” - http://msdn.microsoft.com/en-us/library/ms190273.aspx – KenJ 2010-10-25 19:34:47

2

我相信你得到这个错误,因为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 
+0

+1我的答案是防范不存在的列,但这是没有意义的重新阅读这个问题。 – Andomar 2010-10-25 19:58:31