2016-03-22 2 views
3

Возможно ли нам использовать 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; 

В примере Query больше не доступен для второй команды UPDATE.

EDIT:

Мой рабочий код выглядит следующим образом:

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; 

Поскольку вы не можете обновить две таблицы с командой один UPDATE мне нужны две команды обновления. Проблема заключается в том, что если мне нужно изменить Select в CTE, я должен сделать это в двух местах в коде.

+2

синтаксис регулярного обновления - это «таблица UPDATE table col1 = 1, col2 = 2», почему бы не установить оба столбца в том же самом выражении ? также я никогда не использовал cte с обновлением, поэтому не уверен, что он будет работать. – Jeremy

+0

Это не относится к SQL Server. Команда UPDATE в SQL позволяет одновременно обновлять многие столбцы. Однако сложная часть состоит в том, что этот код пытается обновить * две таблицы *. –

+1

Можете ли вы объяснить, что вы на самом деле пытаетесь сделать? Похоже, вы просто обновляете каждую запись в двух таблицах до одного значения. –

ответ

1

SQL Server UPDATE позволяет обновлять только одну таблицу. Как похоронен в documentation:

Следующий пример обновляет строки в таблице, указав вид как целевого объекта. Определение представления ссылается на несколько таблиц, , однако, оператор UPDATE выполняется успешно, поскольку он ссылается на столбцы только из одной из базовых таблиц. Оператор UPDATE будет иметь , если указаны столбцы из обеих таблиц.

Хотя взгляды и CTE не совсем то же самое, они часто следуют аналогичным правилам. Таким образом, это также описано в разделе, посвященном updatable views:

Любые модификации, в том числе UPDATE, INSERT и DELETE заявления, должны ссылаться на столбцы только с одной базовой таблицы.

Вы можете эффективно делать то, что хотите, путем выпуска двух обновлений и их переноса в одну транзакцию.

+0

Я знаю, что не могу ОБНОВИТЬ две таблицы в одной команде Update. Вот в чем проблема. Свернувшись, я просто хочу сохранить код. В CTE (спасибо Damien за объяснение) у меня есть код SELECT, состоящий из 200 строк. На данный момент у меня есть два CTE с Select и Update каждый. (Что работает) Но если мне нужно изменить SELECT, я должен сделать это в двух местах в коде ... – kami

+0

@kami приветствую программирование на SQL :) – Jeremy

+0

Спасибо Джереми;) – kami

2

Вы можете вставить результат CTE в переменную @Table и использовать эту таблицу везде, где это необходимо в блоке кода. (Вы можете присоединиться к этой таблице с фактической таблицей для выполнения UPDATE/INSERT/DELETE и т. Д.). Вы не можете использовать один и тот же CTE в нескольких операторах, bcz CTE является частью только следующего оператора

+0

Может ли кто-нибудь дать мне пример того, как присоединиться переменная @Table для фактических таблиц? – kami

+0

Это может помочь вам http://stackoverflow.com/questions/2189551/sql-server-table-variable-used-in-a-inner-join –

Смежные вопросы