2013-10-16 32 views
0

有人告诉我做一些改变我们的数据库的模式,所以我写了下面的脚本,执行以下操作:该SQL语法有什么问题?

  1. 更新表的值,根据其它表的价值
  2. 删除包含指向其他表

整个脚本应该只有当课程

这里存在id_to_other_table执行的ID列是我的SQL

IF EXISTS (
SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMN_NAME = 'title_id' AND TABLE_NAME = 'my_table' 
) 
BEGIN 
    UPDATE 
     my_table 
    SET 
     my_table.title = other_table.value 
     FROM 
     my_table 
     INNER JOIN 
     other_table 
    ON 
     my_table.title_id = other_table.id 
    WHERE other_table.language_id = 1 --hardcoded 

    ALTER TABLE my_table 
    DROP COLUMN title_id 
END 

我第一次运行这个SQL,代码被正确执行。当我运行它一次,而不是什么都不做,它给了我下面的错误,JOINON部分后指着行:

Invalid column name 'my_table.title_id'

如果我更换的BEGIN内容 - ENDprint "Does the column exists?"块它正确显示什么都没有,所以BEGIN - END块由于某种原因抢先结束...

任何想法?

+1

你怎么能放弃它后'title_id'加入? – bansi

+0

它不应该加入它,如果它不存在,但它尝试。这是问题的关键 – Loupax

回答

1

实际上,错误是由于您在块(批处理)内执行多个sql语句而生成的。只要你有一批,一些规则适用。由于您正在修改并在一批内引用同一个表,因此会发生编译错误。 只要你单独的两个SQL语句,你不会得到一个编译错误:

IF EXISTS (
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE COLUMN_NAME = 'title_id' AND TABLE_NAME = 'my_table' 
    ) 
    BEGIN 
     UPDATE 
      my_table 
     SET 
      my_table.title = other_table.value 
      FROM 
      my_table 
      INNER JOIN 
      other_table 
     ON 
      my_table.title_id = other_table.id 
     WHERE other_table.language_id = 1 --hardcoded 

     END 

    IF EXISTS (
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE COLUMN_NAME = 'title_id' AND TABLE_NAME = 'my_table' 
    ) 
    BEGIN 
     ALTER TABLE my_table 
     DROP COLUMN title_id 
    END 
0

SQL在执行之前作为一个整体进行分析。因此,尽管条件语句没有运行,它们仍然被检查有效性。作为解决方法,您可以将命令封装为字符串并使用execsp_executesql来运行它们。