2010-07-21 4 views
1

J'ai une requête qui utilise un curseur pour parcourir les résultats d'une instruction select.SQL dynamique conditionnel avec curseur

L'instruction select en bref sélectionne tous les enregistrements d'une table de mappage que j'ai. L'une des colonnes est 'SourceTableName'. J'utilise ce champ pour générer du SQL dynamique.

Je cherche à ajouter un paramètre à ma procédure stockée, qui me permettra de créer uniquement du SQL dynamique pour le 'SourceTableName' que je veux - SI je passe dans un 'SourceTableNameFilter'. Je suis coincé avec une logique qui enveloppe mon SQL dynamique.

IF @SourceTableNameFilter (paramètre SP) = @SourceTableName (à partir du tableau de correspondance) BEGIN

Générez et exécuter une SQL dynamique basée sur la SourceTableName. Le problème est, je veux que cela fonctionne sur toutes les tables qui reviennent d'un select contre 'SourceTableName' MAIS si un paramètre @SourceTableNameFilter est présent et non null - alors seulement génèrent le SQL dynamique pour toutes les lignes dans le curseur qui correspondent à mon paramètre de filtre.

Y a-t-il un moyen pour moi d'accomplir ceci avec une instruction IF sans copier la logique à l'intérieur du IF/ELSE deux fois?

FETCH NEXT FROM TABLECUR INTO @SourceTableName 
    ,@SourceInColumn 
    ,@SourceOutColumn 
    ,@TargetTableName 
    ,@TargetLookupColumn 
    ,@TargetLookupResultColumn 
    ,@MappingTableID 

WHILE (@@fetch_status <> -1) 
BEGIN 
    IF (@@fetch_status <> -2) 
    BEGIN 


       IF (@SourceTableName = @SourceTableNameFilter) 

       --GENERATE DYNAMIC SQL 

       ELSE 
       --GENERATE DYNAMIC SQL FOR ALL RECORDS 

Générer chaîne SQL dynamique est la même dans les deux cas et l'autre, une façon de changer les conditions pour que je ne suis pas double emploi avec la génération SQL dynamique et de ne pas générer SQL dynamique lorsque le @SourceTableName ! = @SourceTableNameFilter?

Merci

Répondre

2

Pensez à ajouter cette logique à la définition du curseur, plutôt que avoir cette logique dans le traitement de chaque enregistrement du curseur.

Donc, si le curseur est normalement:

DECLARE MY_CURSOR Cursor  FOR 
SELECT SourceTableName, SourceInColumn, SourceOutColumn 
     ,TargetTableName, TargetLookupColumn 
     ,TargetLookupResultColumn, MappingTableID 

FROM MappingTable 
--get source tables when filter is specified; otherwise get all 
WHERE (SourceTableName = @SourceTableNameFilter) OR (LEN(ISNULL(SourceTableNameFilter,'')=0) 

Maintenant, vous pouvez exécuter votre logique métier dans le curseur sans avoir à détecter la table filtrée ou non. Le curseur est chargé avec les enregistrements dont vous avez besoin. Il semble, d'après la question, que la logique métier soit la même, peu importe si le filtre a été transmis ou non. Si cela est incorrect, ou s'il ne répond pas à vos exigences, veuillez commenter.

+0

Brillant. Merci beaucoup!! – user53885

1

Ne sachant rien sur le SQL dynamique que vous construisez, je vous conseille de faire quelque chose le long des lignes de:

SET @DynamicCommand = '<whatever, first part>' 
+ isnull(@SourceTableNameFilter 
      ,'<no special action, perhaps just empty string>' 
      ,'<add conditional text dependent upon contents of @SourceTableNameFilter>') 
+ '<whatever, second part>' 
+0

Merci. J'ai rencontré un problème lorsque je suis allé cette route car le curseur ne permet pas le SQL dynamique. Je me trompe probablement mais j'apprécie la réponse! – user53885