SQL Server 2005-Tabelle die Variable-Update-Problem
Habe ich gelesen über die Unterschiede zwischen Table-Variablen und temporäre Tabellen und stolperte dabei über das folgende Problem mit der Table-Variablen. Ich habe dieses Problem nicht erwähnt in den Artikeln, die ich verfolgte.
Ich pass in eine Reihe von PKs über eine XML-Datentyp und erfolgreich erstellen Sie die Datensätze in die beiden temp-Tabellen-Strukturen. Wenn ich versuche zu aktualisieren, weitere Felder in der temp-Tabellen Tabelle Variable nicht aber die Temp-Tabelle hat kein problem mit der Update-Anweisung. Was muss anders machen? Ich möchte, um die Vorteile der Geschwindigkeit zu steigern, die Table-Variablen Versprechen...
Hier sind die SP-Schnipsel und Ergebnisse:
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))
Fehler beim letzten update-Anweisung dort :
Erklären müssen die Skalare variable "@ERTableVariable".
ExpenseReportProjectID aktualisiert in #ERTempTable, wenn das Letzte update ist auskommentiert:
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen schnellen test funktioniert, wenn ich literalize der Tabelle var Referenz bei der letzten Aktualisierung:
Könnte man auch ein "update von':
Join möglicherweise mehrere Zeilen zurückgeben, aber nur einer wird 'stick'. Art von einem nicht-deterministischen update wie 'TOP 1'.
Versuchen Sie dies: