2017-09-21 4 views
0

Hey tout ce que j'ai ce code de requête ci-dessous dans une procédure stockée:T-SQL ajoutant CASE Lorsque ensuite les déclarations actuelles SELECT

/************************************/ 
/*   The Query    */ 
/************************************/ 
SELECT AMTddbox  AS NETWORK      FROM mainpage_AMTdata 
SELECT name   AS TYPE       FROM typeOf 
SELECT name   AS PHASE      FROM IncrementPhase 
SELECT theLevel  AS 'SUPPORT LEVEL'    FROM supportLevel 
SELECT location  AS LOCATION      FROM location 

(CASE 
    WHEN 
    (@val1 = 'inventory') 
    THEN 
    SELECT invID  AS inventoryID    FROM invData 
    SELECT name   AS invName     FROM invUsers 
END) 

Et bien sûr, le T-SQL ne fonctionne pas au-dessus en raison de l'erreur de :

Procédure spExcelData, ligne 30 [lot démarrage ligne 18] Syntaxe incorrecte près du mot clé 'SELECT'.

Procédure spExcelData, ligne 32 [ligne de démarrage par lots 18] Syntaxe incorrecte près de ')'.

Alors, comment puis-je aller à faire ce que je voulais faire pour que je vérifie si @val correspondent aux stocks ou autre chose? Si fait égal alors j'en ai besoin pour renvoyer les 2 autres instructions select en même temps que les 5 autres au dessus.

Répondre

1

Case est une expression. Il ne peut pas être utilisé comme une déclaration pour contrôler le flux. Vous devrez utiliser une instruction IF ici.

if @val1 = 'inventory' 
begin 
    SELECT invID AS inventoryID 
    FROM invData 

    SELECT name AS invName 
    FROM invUsers 
end 
+0

Ça y est, merci Sean! – StealthRT

0

Une expression CASE entre dans une instruction SELECT, et non l'inverse. Si le résultat de @ val1 pour vous va changer la structure entière de votre instruction SELECT, comme si vous utilisiez une table différente, alors vous voudriez utiliser un IF/ELSE. S'il est juste de changer les colonnes/valeurs sont renvoyées de la même table, vous pouvez utiliser une expression CASE au sein de votre instruction SELECT:

SELECT CASE @val1 WHEN 'inventory' THEN invID ELSE OtherColumnName END as 
myColumn FROM invData 
0

Tout d'abord, vous avez 5 ensembles de résultats distincts, chacun avec une seule colonne. C'est parfaitement valide, mais cela me semble un peu étrange s'il n'y a pas de relation entre ces tables pour faire une jointure. En ce qui concerne l'erreur, vous avez simplement une instruction flottante case là. Vous devez utiliser une déclaration de cas dans le contexte d'une expression plus large, comme une clause select ou where (par exemple select case when @val1 = 'Inventory' then ...)

En outre, une déclaration de cas ne peut renvoyer une seule valeur scalaire. Vous pouvez utiliser case dans une liste de sélection, et il sera évalué sur chaque ligne, mais vous ne pouvez pas avoir alors when ou then être un ensemble de résultats ou une table. Vous pouvez également ne pas avoir revenir deux résultats (votre sélectionnez de invData et votre sélectionnez de investoryId

Si la nature en ligne de case semble vous limiter trop, vous pourriez regarder un bon vieux façonné if/else au lieu