2013-08-19 8 views
5

Pracuję z procedury przechowywanej na serwerze SQL 2008 Mam pisemnej następującą procedurę przechowywanąJak połączyć operatora w klauzulę gdzie?

CREATE PROCEDURE [dbo].[sp_]  
@jobNumber VARCHAR(60), 
@customerId VARCHAR(6), 
@isType BIT 

AS 

BEGIN 
DECLARE 
    @dynamicDir BIT, 
    @permit VARCHAR(6), 
    @fPSVersion VARCHAR(2) 
SELECT @dynamicDir = [EDEXMIS].[dbo].[CM].[DynamicDirs] FROM [EDEXMIS].[dbo].[CM] 
     WHERE [EDEXMIS].[dbo].[CM].[CustID] = @customerId 
IF @isType = 1 
    BEGIN 
     IF @dynamicDir = 0 
      BEGIN 
       SET @permit = 'FAX' 
       SET @fPSVersion = '=' 
      END 
     ELSE 
      BEGIN 
       SET @permit = 'FAX' 
       SET @fPSVersion = '>' 
      END 
    END 
Select * From MM where Permit [email protected] and FPSVersion "Here i want the variable value @fpsVersion" 1      

END 

Ale nie wiem jak kon-CAT operatora warunkowego w klauzuli WHERE .I pomyśleć jestem robi to niesłusznie, ale jeśli jest jakakolwiek inna metoda, proszę zasugeruj. Każda pomoc byłaby świetna.

Odpowiedz

3

Spróbuj jeden -

CREATE PROCEDURE [dbo].[usp_] 

    @customerId VARCHAR(6), 
    @isType BIT 

AS BEGIN 

    DECLARE 
     @permit VARCHAR(6), 
     @fPSVersion VARCHAR(2) 

    SELECT 
      @fPSVersion = CASE WHEN t.DynamicDirs = 0 THEN '=' ELSE '>' END 
     , @permit = 'FAX' 
    FROM dbo.CM t 
    WHERE t.CustID = @customerId 
     AND @isType = 1 

    DECLARE @SQL NVARCHAR(MAX) 
    SELECT @SQL = ' 
    SELECT * 
    FROM dbo.MM 
    WHERE Permit = ''' + @permit + ''' 
     AND FPSVersion ''' + @fPSVersion + ''' 1' 

    EXEC sys.sp_executesql @SQL 

END 
+1

Jest to lepsze rozwiązanie niż pierwsze, ponieważ zajęte są przyszłe wartości @fpsversion. – andrewb

+0

Czy mogę utworzyć kompletne oddzielne sp dla mojego drugiego zapytania wyboru, ponieważ jest ono również skomplikowane, a następnie wywołać to sp z tego sp i zwrócić zestaw danych z tego sp –

+0

@Curiosity, nie jestem pewien, czy zrozumiałeś poprawnie. Zobacz zaktualizowaną odpowiedź. – Devart

4

Jak o:

SELECT * 
FROM MM 
WHERE 
    Permit = @permit 
    AND (FPSVersion = 1 AND @dynamicDir = 0) 
    OR (FPSVersion > 1 AND @dynamicDir <> 0) 
+1

Jeśli zmiany logiczne obejmować andrewb

+3

, ale reguła DevArt wywołuje również dynamiczny SQL, co może prowadzić do problemów z wydajnością (jeśli są stosowane nieprawidłowo). –

Powiązane problemy