使用公用表表达式并执行多个更新命令

kam*_*ami 6 sql sql-server sql-server-2008

我们CTE是否可以执行多个更新命令?

With Query AS
(
    SELECT
        Table_One.FOO AS FOO,
        Table_Two.BAR AS BAR
    FROM FOO
    JOIN BAR ON FOO.ID = BAR.ID
)
UPDATE
    Query.FOO = 1;
UPDATE
    Query.BAR = 2;
Run Code Online (Sandbox Code Playgroud)

在示例中,第二个UPDATE命令上的查询不再可用。

编辑:

我的工作代码如下所示:

With Query AS
(
    SELECT
        Table_One.FOO AS FOO,
        Table_Two.BAR AS BAR
    FROM FOO
    JOIN BAR ON FOO.ID = BAR.ID
)
UPDATE
    Query.FOO = 1

With Query AS
(
    SELECT
        Table_One.FOO AS FOO,
        Table_Two.BAR AS BAR
    FROM FOO
    JOIN BAR ON FOO.ID = BAR.ID
)
UPDATE
    Query.BAR = 2;
Run Code Online (Sandbox Code Playgroud)

因为您不能使用一个UPDATE命令来更新两个表,所以我需要两个Update命令。正确的问题是,如果需要更改CTE中的“选择”,则必须在代码中的两个位置上进行选择。

Abd*_*eed 6

您可以将CTE结果插入到@Table变量中,并在代码块中任何需要的地方使用此表。(您可以join将此表与实际表一起执行UPDATE/INSERT/DELETE等)。您不能在多个语句中使用相同的 CTE,因为 CTE 仅是后续语句的一部分。


Gor*_*off 5

SQL Server UPDATE仅允许您更新单个表。如埋在文档中

以下示例通过将视图指定为目标对象来更新表中的行。视图定义引用了多个表,但是,该UPDATE语句成功,因为它仅引用了一个基础表中的列。如果指定了两个表中的列,则UPDATE语句将失败。

尽管视图和CTE并非完全相同,但它们通常遵循相似的规则。因此,有关可更新视图的部分也对此进行了说明:

包括UPDATEINSERTDELETE 语句在内的任何修改都只能引用一个基本表中的列。

通过发布两个更新并将它们包装在一个事务中,您可以有效地执行所需的操作。