我正在编写一个(看似)直接的SQL片段,在确保列存在后删除列.
问题:如果列不存在,代码内 IF子句抱怨说,它无法找到列!好吧,doh,这就是它在IF条款中的原因!
所以我的问题是,为什么一段不应该执行的代码会出错?
这是片段:
IF exists (select * from syscolumns WHERE id=object_id('Table_MD') and name='timeout') BEGIN ALTER TABLE [dbo].[Table_MD] DROP COLUMN timeout END GO
......这是错误:
Error executing SQL script [...]. Invalid column name 'timeout'
我正在使用Microsoft SQL Server 2005 Express Edition.
IF exists (select * from syscolumns WHERE id=object_id('Table_MD') and name='timeout') BEGIN DECLARE @SQL nvarchar(1000) SET @SQL = N'ALTER TABLE [dbo].[Table_MD] DROP COLUMN timeout' EXEC sp_executesql @SQL END GO
原因:当Sql server编译代码时,他们会检查使用过的对象(如果存在).此检查过程忽略任何"IF","WHILE"等构造,并简单地检查代码中所有使用的对象.