2016-04-26 12 views
2

Das ist mein gespeicherte Prozedur wird so weitgespeicherte SQL-Prozedur ändern mit IF-ELSE

ALTER PROC [dbo].[getItems] 
    (
    @EventId int, 
    @OrgUserId int 
) AS 

BEGIN 

DECLARE @BoardBookId int; 
SET @BoardBookId = (SELECT bb.BoardbookId FROM Boardbook bb WHERE bb.ItemId = @EventId); 

WITH PermissionDeniedAttachments AS 
(
    SELECT bbi.CategoryItemId 
    FROM BoardbookItem bbi 
    INNER JOIN CategoryItem ci ON ci.CategoryItemId = bbi.CategoryItemId 
    WHERE bbi.BoardbookId = @BoardBookId AND bbi.CategoryItemId > 0 AND ci.catID NOT IN (SELECT catID from dbo.f_Categories(@OrgUserId)) 
) 
SELECT 
    bbi.BoardbookId, 
    bbi.BoardbookItemId, 
    bbi.CategoryItemId, 
    bbi.ChBy, 
    bbi.ChDt, 
    bbi.CrBy, 
    bbi.CrDt, 
    bbi.DeletedBy, 
    bbi.DeletedDt, 
    bbi.Description, 
    bbi.Duration, 
    bbi.ParentBoardbookItemId, 
    bbi.SortOrder, 
    bbi.Title, 
    bbi.Resolutions, 
    bbi.Presenter, 
    bbi.BoardbookItemType, 
    u1.Name_FirstLast as [ItemCreatedByName], 
    u2.Name_FirstLast as [ItemChangedByName], 
    CAST(CASE WHEN ci.deletedDt IS NULL THEN 0 
         ELSE 1 END AS BIT) AS Deleted, 
    i.itemType as [DocType], 
    ISNULL(ci.catID, 0) AS CatId, 
    ISNULL(ci.itemID, 0) AS ItemId, 
    d.docID as docId, 
    d.docPages as DocPages, 
    d.docPwdProtected AS HasPassword, 
    bbi.BoardbookItemTypeCustom 
from BoardbookItem bbi 
LEFT JOIN Users u1 on u1.UserName=bbi.CrBy 
LEFT JOIN Users u2 on u2.UserName=bbi.ChBy 
LEFT OUTER JOIN CategoryItem ci ON bbi.CategoryItemId IS NOT NULL AND bbi.CategoryItemId = ci.CategoryItemId 
LEFT JOIN Item i ON ci.itemID = i.itemID 
LEFT JOIN Documents d on d.docID = bbi.DocId 
      where [email protected] AND bbi.DeletedDt IS NULL AND 
     (bbi.CategoryItemId IS NULL OR bbi.CategoryItemId NOT IN (Select CategoryItemId from PermissionDeniedAttachments)) 

Nun, was ich will, ist ein var @submenuitem bit zu setzen und es zu testen ... Also, wenn @submenuitem = 0 ich als Antwort haben der gleiche Effekt, den ich jetzt bekomme, , aber wenn @submenuitem = 1 Ich möchte noch einen Scheck in der "wo" für ex. 'AND bbi.ParentBoardbookItemId='0'

Es scheint, dass es möglich ist, mit IF ELSE Aussagen gemacht werden, aber leider kann ich es den richtigen Weg nicht

Vielen Dank im Voraus!

+0

, die für diesen RDBMS ist? Bitte fügen Sie ein Tag hinzu, um anzugeben, ob Sie 'mysql',' postgresql', 'sql-server',' oracle' oder 'db2' verwenden - oder etwas ganz anderes. –

Antwort

1

Ich würde empfehlen, diese einfache Änderung Ihrer WHERE Klausel machen:

LEFT JOIN Documents d on d.docID = bbi.DocId 
     where [email protected] AND bbi.DeletedDt IS NULL AND 
    (bbi.CategoryItemId IS NULL OR bbi.CategoryItemId NOT IN (Select CategoryItemId from PermissionDeniedAttachments) 
     AND (@submenuitem = 0 OR bbi.ParentBoardbookItemId='0') 
6

Es ist definitiv ohne if... else Aussage möglich.

Gerade diese

AND ((bbi.ParentBoardbookItemId='0' and @submenuitem = 1) or @submenuitem = 0) 

zu where Zustand hinzufügen und es wird funktionieren, wie Sie beschrieben haben.

+0

Danke! Es sieht einfach aus und ich bekomme keine Fehler. Ich werde es jetzt vom Kunden testen (Front-End) – George

+0

Dieser Zustand ist übermäßig komplex. Es kann einfach 'AND sein (@submenuitem = 0 ODER bbi.ParentBoardbookItemId = '0')' –

+0

@GeorgiosDeliandreadis Wenn Leistung ein Problem ist, testen. Ich habe herausgefunden, dass ORs signifikant mitgehört werden. Eine Umgehung besteht darin, eine UNION zu verwenden und die Abfrage zu duplizieren, wobei die oberste Seite die eine Seite der ODER-Verknüpfung und die untere die zweite Seite der ODER-Verknüpfung ist. – UnhandledExcepSean