Ajout de colonne à la procédure stockée conditionnellement

J'ai la procédure stockée (simplifiée) suivante:

CREATE FUNCTION [dbo].[UDF_FulfilmentBatch](@FulfilmentID INT) RETURNS @Result TABLE ( [sequence] INT, membershipid BIGINT, membershipNo VARCHAR(255) ) AS BEGIN DECLARE @_sequence INT DECLARE @_membershipid BIGINT DECLARE @_membershipNo VARCHAR(255) SET @_sequence = 1 IF @FulfilmentID = 4 BEGIN DECLARE FulfilCursor CURSOR FAST_FORWARD FOR SELECT * from VW_FulfilmentExtract_HH END IF @FulfilmentID = 3 BEGIN DECLARE FulfilCursor CURSOR FAST_FORWARD FOR SELECT * from VW_FulfilmentExtract_ID END ELSE IF @FulfilmentID = 2 BEGIN DECLARE FulfilCursor CURSOR FAST_FORWARD FOR SELECT * from VW_FulfilmentExtract_Art END ELSE DECLARE FulfilCursor CURSOR FAST_FORWARD FOR SELECT * from VW_FulfilmentExtract_Tha OPEN FulfilCursor FETCH NEXT FROM FulfilCursor INTO @_membershipid, @_membershipNo WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO @Result VALUES (@_sequence, @_membershipid, @_membershipNo) SET @_sequence = @_sequence + 1 FETCH NEXT FROM FulfilCursor INTO @_membershipid, @_membershipNo END CLOSE FulfilCursor DEALLOCATE FulfilCursor RETURN END GO 

Mon problème est que lorsque FulfilmentID = 4, je veux append un champ supplémentaire – 'Livraison'

Si vous avez essayé ce qui suit:

 CREATE FUNCTION [dbo].[UDF_FulfilmentBatch](@FulfilmentID INT) RETURNS @Result TABLE ( [sequence] INT, membershipid BIGINT, membershipNo VARCHAR(255) IF @FulfilmentID = 4 BEGIN ,Delivery VARCHAR(255) END ) AS BEGIN DECLARE @_sequence INT DECLARE @_membershipid BIGINT DECLARE @_membershipNo VARCHAR(255) IF @FulfilmentID = 4 BEGIN DECLARE @_Delivery VARCHAR(255) END SET @_sequence = 1 IF @FulfilmentID = 4 BEGIN DECLARE FulfilCursor CURSOR FAST_FORWARD FOR SELECT * from VW_FulfilmentExtract_HH END IF @FulfilmentID = 3 BEGIN DECLARE FulfilCursor CURSOR FAST_FORWARD FOR SELECT * from VW_FulfilmentExtract_ID END ELSE IF @FulfilmentID = 2 BEGIN DECLARE FulfilCursor CURSOR FAST_FORWARD FOR SELECT * from VW_FulfilmentExtract_Art END ELSE DECLARE FulfilCursor CURSOR FAST_FORWARD FOR SELECT * from VW_FulfilmentExtract_Tha OPEN FulfilCursor FETCH NEXT FROM FulfilCursor INTO @_membershipid, @_membershipNo WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO @Result VALUES (@_sequence, @_membershipid, @_membershipNo IF @FulfilmentID=4 BEGIN @_Delivery ) SET @_sequence = @_sequence + 1 FETCH NEXT FROM FulfilCursor INTO @_membershipid, @_membershipNo END CLOSE FulfilCursor DEALLOCATE FulfilCursor RETURN END GO 

Mais cela n'a pas fonctionné (Veuillez excuser les erreurs de syntaxe, ceci est une approximation pour SO)

Formulaire de search sur le web il ne semble pas y avoir beaucoup à ce sujet. Peut-il être fait?

Il y a beaucoup de problèmes dans votre code:

  • utilisez SELECT *
  • utiliser le slider

Au final, c'est trop compliqué et ressemble beaucoup au code de l'application (C #, java, …)

Ce que vous voulez faire doit être fait avec un seul Select (c'est-à-dire sur un set de données). Les noms de colonnes doivent également figurer entre SELECT et FROM.

Une option est:

 CREATE FUNCTION [dbo].[UDF_FulfilmentBatch](@FulfilmentID INT) RETURNS TABLE AS RETURN ( SELECT sequence = ROW_NUMBER() Over(Order By (Select 1)) , _membershipid, membershipNo, delivery FROM VW_FulfilmentExtract_HH WHERE @FulfilmentID = 4 UNION ALL SELECT sequence = ROW_NUMBER() Over(Order By (Select 1)) , _membershipid, membershipNo, delivery = NULL FROM VW_FulfilmentExtract_ID WHERE @FulfilmentID = 3 UNION ALL SELECT sequence = ROW_NUMBER() Over(Order By (Select 1)) , _membershipid, membershipNo, delivery = NULL FROM VW_FulfilmentExtract_Art WHERE @FulfilmentID = 2 UNION ALL SELECT sequence = ROW_NUMBER() Over(Order By (Select 1)) , _membershipid, membershipNo, delivery = NULL FROM VW_FulfilmentExtract_Tha WHERE @FulfilmentID = not in (2, 3, 4) ); 

Ici, j'utilise ROW_NUMBER pour générer votre numéro de séquence.

J'ai ajouté la colonne Livraison et l'ai définie à NULL quand elle n'est pas nécessaire.

Vous devez mettre à jour le nom des colonnes. Je les devine juste.

En passant, ce n'est pas une procédure stockée mais une fonction définie par l'user en ligne