2008-11-06 9 views
8

Ich habe über die Unterschiede zwischen Tabellenvariablen und Temp Tabellen gelesen und stolperte über das folgende Problem mit der Tabellenvariable. Ich habe dieses Problem in den Artikeln, die ich verfolgt habe, nicht erwähnt.SQL Server 2005 Tabellenvariable Update Problem

Ich gebe eine Reihe von PKs über einen XML-Datentyp und erfolgreich erstellt die Datensätze in beiden Temp-Tabellenstrukturen. Wenn ich versuche, weitere Felder in den temporären Tabellen zu aktualisieren, schlägt die Tabellenvariable fehl, aber die Temp-Tabelle hat kein Problem mit der Aktualisierungsanweisung. Was muss anders gemacht werden? Ich möchte die Vorteile der Geschwindigkeit nehmen, dass die Tabelle Variables Versprechen steigern ...

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 in dort: die skalare Variable deklarieren muss „@ ERTableVariable ".

ExpenseReportProjectID wird in #ERTempTable aktualisiert, wenn das letzte Update heraus kommentiert:

Antwort

16

Ein schneller Test funktioniert, wenn ich die Tabelle var Referenz in der letzten Aktualisierung literalize:

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

Sie könnten auch ein 'Update von' verwenden

Die Verknüpfung kann mehrere Zeilen zurückgeben, aber nur eine wird "kleben". Art eines nicht-deterministischen Updates wie 'TOP 1'.

+0

Danke, ich werde das in meine Trickkiste legen ... –

0

Try this:

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