【问题标题】:How to concatenate operator into where Clause ?如何将运算符连接到 where 子句中?
【发布时间】:2013-08-20 21:16:17
【问题描述】:

我正在使用 SQL Server 2008 中的存储过程,我编写了以下存储过程

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 =@permit and FPSVersion "Here i want the variable value @fpsVersion" 1                    

END 

但我不知道如何在 where 子句中连接条件运算符。我认为我做错了,但如果有任何其他方法可以做到这一点,请提出建议。任何帮助都会很棒。

【问题讨论】:

    标签: sql sql-server sql-server-2008 stored-procedures


    【解决方案1】:

    怎么样:

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

    【讨论】:

    • 如果逻辑更改为包含
    • 是的,但 DevArt 的规则也会调用动态 SQL,这可能会导致性能问题(如果使用不当)。
    【解决方案2】:

    试试这个 -

    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 
    

    【讨论】:

    • 这比第一个要好,因为@fPSVersion 的未来值得到了照顾。
    • 我可以为我的第二个选择查询创建完整的单独 sp,因为它也很复杂,然后从这个 sp 调用那个 sp 并从这个 sp 返回数据集
    • @Curiosity,我不确定您是否正确理解。请查看更新后的答案。
    • @Devart 我想知道我可以为 SELECT SQL 创建新的存储过程,然后从此过程中调用该过程并返回选定的值。有没有可能
    • @Curiosity - 是的,当然。尝试使用INSERT INTO EXEC 构造。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2011-01-10
    • 1970-01-01
    • 2010-10-21
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多