2010-12-08 18 views
0

Mon problème est que je veux fusionner deux SP en un. le squelette du sp qui en résulte est:TSQL: Si une instruction dans une instruction With

with Paging(RowNo, ID, Name, Description, LengthSeconds, Rating, Url, ThumbnailFileName, AddedAt) AS 
    (
    (if(@SortType is null) 
     begin 
     ... select ... 
     end 
     else 
     begin 
     ... select... 
     end 
    ) 

    select * from Paging ... 

Puis-je faire cela Si dans l'instruction with?

Répondre

8

Non ,,, ce serait quelque chose comme

with Paging(RowNo, ID, Name, Description, LengthSeconds, Rating, Url, ThumbnailFileName, AddedAt) AS 
(
    select ... 

    WHERE @SortType is not null 
    UNION ALL 
    select ... 

    WHERE @SortType is null 
)... 

Si la requête est aussi simple que cela si, alors vous pas besoin d'un CTE: il n'ajoute pas readibility

+0

comment puis-je faire paging sans CTE? –

+1

Vous pouvez effectuer une pagination en ajoutant la clause OVER "ROW_NUMBER() OVER (ORDER BY ..." au CTE, puis un BETWEEN à la page par rapport aux numéros de ligne.) – IamIC

+1

La pagination sera encore plus facile dans SQL Server 2011 avec 'FETCH' et 'OFFSET', mais pas de support pour référencer la ligne suivante/précédente dans la clause' OVER'. –

0

Vous pourriez utiliser un union où la face supérieure correspond à la première moitié de la if:

select ... 
where @SortType is null 
union all 
select ... 
where @SortType not null null 

une instruction if est interdit à l'intérieur d'une requête, seulement pour contrôler les flux autour des requêtes. Donc, un if à l'intérieur d'un with n'est pas autorisé.