2008-11-06 95 views
8

我一直在閱讀表變量和臨時表之間的差異,並偶然發現了表變量的下列問題。我沒有看到我追求的文章中提到的這個問題。SQL Server 2005表變量更新問題

我通過XML數據類型傳入一系列PK,併成功在兩個臨時表結構中創建記錄。當我嘗試更新臨時表中的更多字段時,表變量失敗,但臨時表對於更新語句沒有問題。需要做什麼不同?我想利用速度的優勢,促進該表變量的諾言......

這裏是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更新時最後一次更新被註釋掉:

回答

16

簡單的測試工作,當我在literalize上次更新表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 

連接可能會返回多行,但只有一行會「粘住」。一種非確定性更新,如「TOP 1」。

+0

謝謝,我會把它放在我的竅門中...... – 2008-11-06 20:23:38

0

試試這個:

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