Я читал о различиях между табличными переменными и временными таблицами и наткнулся на следующую проблему с табличной переменной. Я не видел, чтобы эта проблема упоминалась в статьях, которые я преследовал.
Я передаю серию 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, когда последнее обновление закомментировано:





Попробуй это:
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».