2008-11-06 7 views
8

He estado leyendo acerca de las diferencias entre las variables de tabla y tablas de temperatura y tropecé con el siguiente problema con la variable de tabla. No vi este tema mencionado en los artículos que perseguí.Problema de actualización de la variable de la tabla SQL Server 2005

Paso en una serie de PK a través de un tipo de datos XML y creo exitosamente los registros en ambas estructuras de tablas temporales. Cuando intento actualizar más campos en las tablas temporales, la variable de tabla falla, pero la tabla temporal no tiene ningún problema con la instrucción de actualización. ¿Qué hay que hacer diferente? Me gustaría aprovechar la velocidad de impulsar que las variables de tabla promesa ...

Éstos son los fragmentos y Resultados 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)) 

de error cuando la última instrucción de actualización de allí: debe declarar la variable escalar "@ ERTableVariable ".

ExpenseReportProjectID se actualiza en #ERTempTable cuando la última actualización está comentado:

Respuesta

16

Una prueba rápida funciona cuando literalizar la referencia de tabla var en la última actualización:

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

Usted podría también utilizar una 'actualización desde':

UPDATE er SET 
    ExpenseReportProjectID = ExpenseReportItem.ExpenseReportProjectID 
FROM @ERTableVariable er 
INNER JOIN ExpenseReportItem ON 
    ExpenseReportItem.ExpenseReportID = er.ExpenseReportID 

La combinación puede devolver varias filas pero solo una se 'pegará'. Una especie de actualización no determinista como 'TOP 1'.

+0

Gracias, voy a poner eso en mi bolsa de trucos ... –

0

Prueba esto:

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 
Cuestiones relacionadas