2008-11-06 28 views
8

Tablo Değişkenleri ve Sıcaklık Tabloları arasındaki farkları okudum ve Tablo Değişkeni ile ilgili aşağıdaki sorun üzerinde tökezledim. Takip ettiğim makalelerde bahsedilen bu sorunu görmedim.SQL Server 2005 Tablo Değişken Güncelleştirme Sorunu

XML veri türü aracılığıyla bir seri PK'yi geçiriyorum ve her iki geçici tablo yapısında da kayıtları başarıyla oluşturuyorum. Temp tablolarındaki diğer alanları güncellemeyi denediğimde, Tablo Değişkeni başarısız olur, ancak Sıcaklık Tablosunun Güncelleme Bildirimi ile ilgili bir sorunu yoktur. Farklılaşmak için neye ihtiyaç var? " skaler değişkeni bildirmeniz gerekir @: son güncelleme ifadesi orada

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)) 

Hata: Ben burada

SP parçacıkları ve Sonuçlar vardır ... o Tablo Değişkenler söz artırmak hız yararlanmak istiyoruz ERTableVariable". Son güncelleme dışarı yorum zaman

ExpenseReportProjectID #ERTempTable güncellenir:

cevap

16

Geçen güncellemede tablo var referansını literalize zaman hızlı bir test çalışır:

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

Ayrıca, bir 'dan güncelleştirme' kullanabilirsiniz

Birleştirici birden çok satır döndürebilir, ancak yalnızca bir tanesi "yapışır". 'TOP 1' gibi belirsiz olmayan bir güncelleme türü.

+0

Teşekkürler, bunu benim çantamın içine koyacağım ... –

0

bu deneyin:

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