2013-08-19 6 views
5

Sto lavorando con la stored procedure in SQL Server 2008 che ho scritto la seguente stored procedureCome concatenare l'operatore in dove Clausola?

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 

ma io non so come con-gatto l'operatore condizionale nella clausola in cui .I pensi che io sia fallo in modo sbagliato, ma se c'è un altro modo per farlo, si prega di suggerire. Qualsiasi aiuto sarebbe grande.

risposta

3

provare questo -

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

Questo è migliore del primo perché i valori futuri di @fPSVersion sono presi in considerazione. – andrewb

+0

Posso creare la sp separata completa per la mia seconda query di selezione in quanto è anche complicata e quindi chiamare tale sp da questa sp e restituire il set di dati da questo sp –

+0

@Curiosity, non sono sicuro di averlo capito correttamente. Si prega di consultare la risposta aggiornata. – Devart

4

ne dite:

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

Se le modifiche di logica per includere andrewb

+3

true, ma la regola di DevArt richiama anche l'SQL dinamico, che può portare a problemi di prestazioni (se utilizzati in modo improprio). –