Проблема обновления переменной таблицы SQL Server 2005

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

Я передаю серию PK через тип данных XML и успешно создаю записи в обеих структурах временных таблиц. Когда я пытаюсь обновить дополнительные поля во временных таблицах, переменная таблицы не работает, но временная таблица не имеет проблем с оператором обновления. Что нужно делать по другому? Я хотел бы воспользоваться преимуществом увеличения скорости, которое обещают Table Variables ...

Вот фрагменты SP и результаты:

CREATE PROCEDURE ExpenseReport_AssignApprover
(
    @ExpenseReportIDs       XML
)
AS


DECLARE     @ERTableVariable        TABLE   (   ExpenseReportID             INT,
                                                ExpenseReportProjectID      INT,
                                                ApproverID                  INT)


CREATE TABLE #ERTempTable
(
    ExpenseReportID             INT,
    ExpenseReportProjectID      INT,
    ApproverID                  INT
)

INSERT INTO @ERTableVariable (ExpenseReportID)
SELECT ParamValues.ID.value('.','VARCHAR(20)')
FROM @ExpenseReportIDs.nodes('/Root/ExpenseReportID') as ParamValues(ID)

INSERT INTO #ERTempTable (ExpenseReportID)
SELECT ParamValues.ID.value('.','VARCHAR(20)')
FROM @ExpenseReportIDs.nodes('/Root/ExpenseReportID') as ParamValues(ID)

UPDATE          #ERTempTable
SET             ExpenseReportProjectID = (  SELECT TOP 1 ExpenseReportProjectID 
                                                FROM ExpenseReportItem 
                                                WHERE(ExpenseReportID = #ERTempTable.ExpenseReportID))

UPDATE          @ERTableVariable
SET             ExpenseReportProjectID = (  SELECT TOP 1 ExpenseReportProjectID 
                                                FROM ExpenseReportItem 
                                                WHERE(ExpenseReportID = @ERTableVariable.ExpenseReportID))

Ошибка при последней инструкции обновления там: Необходимо объявить скалярную переменную «@ERTableVariable».

ExpenseReportProjectID обновляется в #ERTempTable, когда последнее обновление закомментировано:

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
11 867
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуй это:

CREATE PROCEDURE ExpenseReport_AssignApprover
(
        @ExpenseReportIDs               XML
)
AS BEGIN


DECLARE         @ERTableVariable                TABLE   (       ExpenseReportID                         INT,
                                                                                                ExpenseReportProjectID          INT,
                                                                                                ApproverID                                      INT)


CREATE TABLE #ERTempTable
(
        ExpenseReportID                         INT,
        ExpenseReportProjectID          INT,
        ApproverID                                      INT
)

INSERT INTO @ERTableVariable (ExpenseReportID)
SELECT ParamValues.ID.value('.','VARCHAR(20)')
FROM @ExpenseReportIDs.nodes('/Root/ExpenseReportID') as ParamValues(ID)

INSERT INTO #ERTempTable (ExpenseReportID)
SELECT ParamValues.ID.value('.','VARCHAR(20)')
FROM @ExpenseReportIDs.nodes('/Root/ExpenseReportID') as ParamValues(ID)

UPDATE                  #ERTempTable
SET                             ExpenseReportProjectID = (      SELECT TOP 1 ExpenseReportProjectID 
                                                                                                FROM ExpenseReportItem 
                                                                                                WHERE(ExpenseReportID = #ERTempTable.ExpenseReportID))

UPDATE                  @ERTableVariable
SET                             ExpenseReportProjectID = (      SELECT TOP 1 ExpenseReportProjectID 
                                                                                                FROM ExpenseReportItem 
                                                                                                WHERE(ExpenseReportID = @ERTableVariable.ExpenseReportID))

END
Ответ принят как подходящий

Быстрый тест сработает, когда я приведу ссылку на таблицу var в последнем обновлении:

UPDATE @ERTableVariable
    SET ExpenseReportProjectID = (      
        SELECT TOP 1 ExpenseReportProjectID
        FROM ExpenseReportItem 
        WHERE ExpenseReportID = [@ERTableVariable].ExpenseReportID
    )

Вы также можете использовать «обновление от»:

UPDATE er SET 
    ExpenseReportProjectID = ExpenseReportItem.ExpenseReportProjectID
FROM @ERTableVariable er
INNER JOIN ExpenseReportItem ON 
    ExpenseReportItem.ExpenseReportID = er.ExpenseReportID

Объединение может вернуть несколько строк, но «прилипнет» только одна. Вид недетерминированного обновления типа «ТОП 1».

Другие вопросы по теме