2017-10-18 14 views
0

Je travaille avec des procédures stockées dans SQL Server pour la première fois. Voici la procédure stockée existante je:Ajouter une condition else if else dans les procédures stockées et renvoyer des valeurs codées en dur?

USE [Hello] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[Profile] 
    (@Culture AS VARCHAR(10)) 
AS 
BEGIN 
    SELECT 
     lt.ID AS TypeId, 
     ltt.Title AS TypeTitle 
    FROM 
     Hello..lkpLocationType lt 
    INNER JOIN 
     Hello..TypeText ltt ON ltt.TypeId = lt.ID 
          AND ltt.Culture = @Culture 
    WHERE 
     lt.IsActive = 1      
END 

Maintenant, je veux ajouter une condition supplémentaire ici, donc je dois avoir if état et else ici.

  • S'il y a une licenseId et sa valeur est 9 puis revenir trois valeurs directement A, B et C
  • exécuter Sinon, le sql courant je qui joint deux tables et la base de retour sur la valeur de la culture et si elle c'est actif.

Est-ce possible de le faire directement dans la procédure stockée par ces trois valeurs hardcoding A, B et C et retour si licenseId valeur est 9? Donc, il me semble que j'ai besoin de modifier cette procédure de modification et licenseId aussi bien? Ai-je raison?

ALTER PROCEDURE [dbo].[Profile] 
    (@Culture AS VARCHAR(10) 
    @LicenseId AS INT) 

Si ce n'est pas possible de le faire, je peux alors exécuter une autre SQL si licenseId valeur est 9 qui peut retourner A, B et C?

Mise à jour: Cela a du sens maintenant. Il y a une chose que je suis confuse maintenant. Mon code VB exécute cette procédure stockée et après qu'il est les valeurs renvoyées itération par mon SQL par extraction de la valeur d'origine existante de deux colonnes TypeTitle et TypeID.

Dim dtLocationTypes As DataTable = dalClientProfile.Profile(Session("Culture"), Session("LicenseID")) 
If dtLocationTypes.Rows.Count > 0 Then 
    ddlLocationType.DataSource = dtLocationTypes 
    ddlLocationType.DataTextField = "TypeTitle" 
    ddlLocationType.DataValueField = "TypeID" 
    ddlLocationType.DataBind() 
End If 

code ci-dessus fonctionnait très bien avant, mais quand j'ajouté LicenseID il en est ainsi l'exécution du bloc Si ​​maintenant dans la procédure stockée mais étant donné que nous ne disposons pas de ces deux colonnes maintenant dans le résultat de Returnd donc je crois qu'il ne peut pas pour en extraire de la valeur. Est-il possible de modifier la procédure stockée pour ce If condition de sorte que lors de l'itération, cela fonctionne bien dans le code VB?

En général c'est la sortie pour SQL qui est dans le bloc ELSE et c'est ainsi que mon code VB est capable de l'extraire. Maintenant, pour le SQL qui est dans le bloc IF, je veux retourner quelque chose comme ça directement dans la procédure stockée si possible?

TypeID TypeTitle 
----------------- 
1  A 
2  B 
3  C 

Répondre

1

Oui, vous pouvez avoir if...else condition procédure stockée:

ALTER PROCEDURE [dbo].[Profile] 
     (
       @Culture AS VARCHAR(10), 
       @LicenseId as int 
     ) 
AS 
BEGIN 
     IF @LicenseId = 9 
     BEGIN 
      SELECT 'A','B','C' 
     END 
     ELSE 
     BEGIN 
      SELECT lt.ID AS TypeId, 
         ltt.Title AS TypeTitle 
      FROM Hello..lkpLocationType lt 
      INNER JOIN Hello..TypeText ltt 
        ON ltt.TypeId = lt.ID 
        AND ltt.Culture = @Culture 
      WHERE lt.IsActive = 1  
     END 
END 

Pour les tests, j'ai créé SQLFIDDLE où vous pouvez voir le résultat de la procédure stockée suivante:

CREATE PROCEDURE [dbo].[Profile] 
     (
       @LicenseId as int 
     ) 
AS 
BEGIN 
     IF @LicenseId = 9 
     BEGIN 
      SELECT 'A','B','C' 
     END 
     ELSE 
     BEGIN 
      SELECT 'A','B' 
     END 
END 
+0

Maintenant, je compris que la façon dont IF, va ELSE travailler dans la procédure stockée. J'ai mis à jour ma question et je voulais voir si nous pouvons le faire directement dans la procédure stockée si possible? – john

+1

Vous pouvez utiliser la condition CASE dans votre instruction SELECT. –

+0

@david: Avez-vous essayé avec la condition CASE dans l'instruction SELECT? –

1

Do vous voulez quelque chose comme

SELECT * 
FROM (VALUES (1, 'A'), (2, 'B'), (3, 'C')) AS T(TypeId, TypeTitle) 

code pseudo plein

IF @LicenseId = 9 
BEGIN 
    SELECT * 
    FROM (VALUES (1, 'A'), (2, 'B'), (3, 'C')) AS T(TypeId, TypeTitle) 
END 
ELSE 
BEGIN 
    Original stored procedure 
END 

BTW, pouvez-vous mis en œuvre dans la couche d'assurance-chômage, il ressemble à une interface utilisateur seule exigence?

0

Vous pouvez utiliser essayer:

ALTER PROCEDURE [dbo].[Profile] 
     (
       @Culture AS VARCHAR(10), 
       @LicenseId as int 
     ) 
AS 
BEGIN 
     IF @LicenseId = 9 
     BEGIN 
      SELECT '1' as TypeId ,'A' as TypeTitle 
      union 
      SELECT '2' as TypeId ,'B' as TypeTitle 
      union 
      SELECT '3' as TypeId ,'C' as TypeTitle 
     END 
     ELSE 
     BEGIN 
      SELECT lt.ID AS TypeId, 
         ltt.Title AS TypeTitle 
      FROM Hello..lkpLocationType lt 
      INNER JOIN Hello..TypeText ltt 
        ON ltt.TypeId = lt.ID 
        AND ltt.Culture = @Culture 
      WHERE lt.IsActive = 1  
     END 
END 

Il vous donnera la sortie prévue pour le bloc IF

TypeID TypeTitle 
----------------- 
1  A 
2  B 
3  C