Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Utilisation de 3 mises à jour dans la même procédure de magasin ? Petite erreur

Vous démarrez le SP avec ;WITH RatingLines ... qui se connecte au premier UPDATE déclaration, pas les autres. Cette construction crée un CTE qui n'est visible que par la première instruction qui le suit. Plus d'explications peuvent être trouvées dans le TN pour WITH common_table_expression (Transact-SQL) . En particulier, cet extrait de Remarques met en évidence ceci :

Pour que cette table soit connue pour toutes les instructions de votre SP, créez une variable de table ou une table temporaire pour les RatingLines Au lieu.

Le plan utilisant une table temporaire serait le suivant :

Select   RDA.[CTS]        AS [CTS]
              ,RDA.[B_KEY]        AS [B_KEY]
              ,RDA.[H_KEY]        AS [H_KEY]
              ,RDA.[RT_ID]        AS [RT_ID]
              ,RDA.[RT_AVGRATING] AS [RT_AVGRATING]
              ,RDDA.[RTD_COMMENT] AS [RTD_COMMENT]
INTO #RatingLines -- Create #RatingLines as temporary table
From  [DynNavHRS].[HRSDB].[HTL_RATING_ALL_DA]        RDA
Join  [DynNavHRS].[HRSDB].[HTL_RATING_DETAIL_ALL_DA] RDDA
ON    RDA.RT_ID =RDDA.RT_ID
AND   RDDA.[RTD_COMMENT] <> ''
AND   RDA.[B_KEY]='19214642';

-- Throughout the rest of the SP, use #RatingLines as your ratings table; eg:
...
INNER JOIN #RatingLines   RL1
...

-- At the end of the SP, drop the temporary table
DROP TABLE #RatingLines;