0

J'ai une requête qui ressemble à ceci:Besoin d'aide sur la réécriture d'une requête qui utilise un curseur

DECLARE Match_Cursor CURSOR 
FOR 
    SELECT ID,UserKey,TypeCode 
    FROM [DB1].Table1 as t1 
OPEN Match_Cursor 

FETCH NEXT FROM Match_cursor INTO @ID,@UserKey,@TypeCode; 
    WHILE (@@FETCH_STATUS <> -1) 
    BEGIN 
     INSERT INTO #TempTable 
      SELECT t2.Name, t2.Address, t2.Country, @UserKey, @TypeCode 
      FROM [DB1].[DBO].udf_TableFunction(@ID) as t2 
      where @typeCode = 142 AND t2.Country = 'US' 
FETCH NEXT FROM Match_cursor INTO @ID,@UserKey,@TypeCode; 
    END 

SELECT * FROM #TempTable 

Quelqu'un at-il des suggestions pour réécrire ce avec des jointures? Supposons qu'il existe une relation de clé étrangère entre t1.ID et t2.ID.

+0

Qu'est-ce que udf_TableFunction retour? Le problème est qu'il renvoie une seule ligne. Pourrait-il être adapté pour renvoyer toutes les lignes (disons si l'ID est NULL), auquel cas vous pourriez vous joindre à cela ... – Sparky

+0

Il retourne une collection de lignes. Il ne peut pas être changé pour retourner toutes les lignes si null est passé, mais null ne sera jamais passé. –

+2

Besoin de voir le contenu de 'udf_TableFunction' –

Répondre

0

Utilisez cross apply pour passer de Table1.ID à udf_TableFunction.

Voici un pseudo code sur la façon dont vous pourriez vous y prendre. (je n'ont pas accès à SSMS en ce moment ne pouvait donc pas tester)

insert #TempTable(...) 
select ... 
from table1 t1 cross apply [DBO].udf_TableFunction(t1.ID) t2 
where ... 
+0

Fini par casser les fonctions de la table dans la requête originale et en utilisant cross apply. –