0

我被告知要对我们的数据库架构进行一些更改,所以我编写了以下脚本来执行以下操作:

  1. 更新表的值,根据另一个表的值
  2. 删除包含指向另一个表的id的列

整个脚本只有在 id_to_other_table 存在的情况下才会被执行

这是我的 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 时,代码已正确执行。当我再次运行它,而不是什么都不做,它给了我以下错误,指向ON部分之后的行JOIN

Invalid column name 'my_table.title_id'

如果我用它正确替换BEGIN-END块的内容,则不会显示任何内容,因此-块由于某种原因抢先结束......print "Does the column exists?"BEGINEND

有任何想法吗?

4

2 回答 2

1

实际上,生成错误是因为您在块内(一个批处理)执行多个 sql 语句。一旦你有一批,一些规则就适用。由于您在 1 个批次中更改并引用同一个表,因此会发生编译错误。只要你分开这两个 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
于 2013-10-16T11:03:54.267 回答
0

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

于 2013-10-16T10:33:56.053 回答