web-dev-qa-db-fra.com

Flux de contrôle dans T-SQL SP utilisant IF..ELSE IF - existe-t-il d'autres moyens?

J'ai besoin de brancher mon flux de contrôle de procédure stockée T-SQL (MS SQL 2008) dans un certain nombre de directions:

CREATE PROCEDURE [fooBar]
   @inputParam INT
AS
BEGIN
  IF @inputParam = 1
  BEGIN
    ...
  END
  ELSE IF @inputParam = 3
  BEGIN
    ...
  END
  ELSE IF @inputParam = 3
  BEGIN
    ...
  END
END

Y a-t-il d'autres moyens? Par exemple, dans C# Je devrais utiliser switch-case bloquer.

38
abatishchev

SI ... ELSE ... est à peu près ce que nous avons dans T-SQL. Il n'y a rien de tel que l'instruction CASE de la programmation structurée. Si vous avez un ensemble étendu de ... ELSE IF ... s à gérer, assurez-vous d'inclure BEGIN ... END pour chaque bloc pour que les choses soient claires, et rappelez-vous toujours qu'une indentation cohérente est votre ami!

38
Philip Kelley

Vous pouvez également essayer de formuler votre réponse sous la forme d'un SELECT CASE Déclaration. Vous pouvez ensuite créer des ifs simples qui utilisent vos résultats si nécessaire, car vous avez réduit les possibilités.

SELECT @Result =   
CASE @inputParam   
WHEN 1 THEN 1   
WHEN 2 THEN 2   
WHEN 3 THEN 1   
ELSE 4   
END  

IF @Result = 1   
BEGIN  
...  
END  

IF @Result = 2   
BEGIN   
....  
END  

IF @Result = 4   
BEGIN   
//Error handling code   
END   
16
JohnDavid

Non, mais vous devez être prudent lorsque vous utilisez IF ... ELSE ... END IF dans les proc stockés. Si vos blocs de code sont radicalement différents, vous pouvez souffrir de performances médiocres car le plan de procédure devra être remis en cache à chaque fois. S'il s'agit d'un système hautes performances, vous souhaiterez peut-être compiler des procs stockés séparés pour chaque bloc de code et demander à votre application de décider quel proc appeler au moment approprié.

11
Stuart Ainsworth

C'est à peu près la limite pour structures de contrôle dans T-SQL , ainsi que GOTO et TOUT EN .

2
Cade Roux

Non IF est le chemin à parcourir, quel est le problème que vous rencontrez avec son utilisation?

BTW votre exemple n'atteindra jamais le troisième bloc de code car il et le deuxième bloc sont exactement identiques.

1
HLGEM