Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有条件“和”逻辑的Transact-SQL存储过程_Sql_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

具有条件“和”逻辑的Transact-SQL存储过程

具有条件“和”逻辑的Transact-SQL存储过程,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,我正在开发一个存储过程,用于根据用户输入的条件过滤网格。在可能的标准中,他们可以选择查看在某个开始日期和结束日期之间完成的事务。我将4个输入参数传递给proc-@ClientKey,即请求信息的客户端,@FilterBy这是从ASP.NET中的下拉列表中选择的值,本质上告诉proc用户是否选择按名称、地址、日期等进行筛选。在这种情况下,日期的@FilterBy值为5,@Value1,在本例中是开始日期,在本例中是结束日期的@Value2 在伪代码中,我想要的是: 选择列的相邻部分 从一些连接表

我正在开发一个存储过程,用于根据用户输入的条件过滤网格。在可能的标准中,他们可以选择查看在某个开始日期和结束日期之间完成的事务。我将4个输入参数传递给proc-@ClientKey,即请求信息的客户端,@FilterBy这是从ASP.NET中的下拉列表中选择的值,本质上告诉proc用户是否选择按名称、地址、日期等进行筛选。在这种情况下,日期的@FilterBy值为5,@Value1,在本例中是开始日期,在本例中是结束日期的@Value2

在伪代码中,我想要的是:

选择列的相邻部分 从一些连接表 哪里有标准 和过滤比的情况
当5时,则d.TransactionTime>=CAST@Value1日期和d.TransactionTime您是指以下内容吗? 你可能会发现这也很有用。 我还没有测试过代码,只是提出了一个想法——写这样的代码对我来说总是错的——也许有人能提供更好的

CREATE PROC MyProc

    @ClientKey  int,
    @FilterBy   int,
    @Value1 varchar(150),
    @Value2 varchar(150)
--  NB WITH RECOMPILE, see link (above)
WITH RECOMPILE AS
BEGIN
    SET NOCOUNT ON;

    SELECT *
    FROM ...
    WHERE 
        Col1    =   CASE 
                        WHEN @FilterBy = 1 THEN @Value1
                        ELSE Col1
                    END
    AND
        1       =   CASE
                        WHEN @FilterBy = 2 AND Col2 > @Value1 AND Col3 < @Value2        THEN 1
                        WHEN @FilterBy = 2 AND NOT (Col2 > @Value1 AND Col3 < @Value2)  THEN 0
                        ELSE 1
                    END 
END

或当@FilterBy=5且d.TransactionTime介于CAST@Value1作为日期和CAST@Value2AS DATE THEN 1 ELSE 0 END=1的工作原理相同,但两者之间的值使代码更具可读性。这只是个人喜好,在执行上没有区别。事实上,在完成另一个系统增强之前,我只做了短暂的测试。现在我回到这里,proc似乎没有返回除5之外的任何与@FilterBy值对应的行。不知道为什么。对于*除5以外的任何@FilterBy值。@Mike我只关注where中的问题区域部分。似乎您需要先使用和@FilterBy或第二个@FilterBy或。。。。。在任何情况下,我都没有检查所有的过滤器谢谢拉马克-了解重点范围。还没有快乐,但仍在努力。
SELECT d.pKey AS PaymentKey, d.CaseKey, d.InvoiceID, d.AuthorizationCode, d.TransactionID, d.PaymentType, d.Amount, d.ExpirationDate, d.CardType, d.BankName, d.AccountNumber, 
    d.AccountType, c.Name, c.Address1, c.City, c.State, c.Zip, cs.PAmount, cs.TranCode, cs.TranDate, cs.[Desc] AS PaymentDescription, cc.[Desc] AS ChargeCodeDescription,
    d.TransactionTime, a.Name AS AssociationName, d.PaymentType, c.ClientPaymentID
FROM DebtorPayment d INNER JOIN Cases c
    ON d.CaseKey = c.pKey
    AND d.ClientKey = c.ClientKey
INNER JOIN CaseSumm cs
    ON d.CaseKey = cs.CaseKey
    AND d.pKey = cs.Batch
    AND d.ClientKey = cs.ClientKey
INNER JOIN ChargeCodes cc
    ON c.ClientKey = cc.ClientKey
    AND cs.TranCode = cc.RefNum
INNER JOIN AssnCtrl a
    ON c.AssnKey = a.pKey
WHERE c.ClientKey = @ClientKey
AND d.AmountAllocated > 0
AND d.TransactionStatus = 'Successful' 
AND c.Address1 LIKE CASE
    WHEN @FilterBy = 1 THEN '%' + @Value1 + '%'
    ELSE c.Address1
    END
AND d.Amount = CASE
    WHEN @FilterBy = 2 THEN @Value1
    ELSE d.Amount
    END  
AND a.pKey = CASE
    WHEN @FilterBy = 3 THEN CAST(@Value1 AS INT)
    ELSE a.pKey
    END
AND c.ClientPaymentID = CASE
    WHEN @FilterBy = 4 THEN @Value1
    ELSE c.ClientPaymentID
    END 
<ProblemArea>
AND CASE @FilterBy
        WHEN 5 THEN d.TransactionTime >= CAST(@Value1 AS Date) AND d.TransactionTime <= CAST(@Value2 AS Date)
    END
</ProblemArea>
AND c.LName LIKE CASE
    WHEN @FilterBy = 6 THEN '%' + @Value1 + '%'
    ELSE c.LName
    END
ORDER BY d.TransactionTime DESC
CASE 
    WHEN @FilterBy = 5 AND d.TransactionTime >= CAST(@Value1 AS DATE) 
    AND d.TransactionTime <= CAST(@Value2 AS DATE) THEN 1 
    ELSE 0 
END = 1
CREATE PROC MyProc

    @ClientKey  int,
    @FilterBy   int,
    @Value1 varchar(150),
    @Value2 varchar(150)
--  NB WITH RECOMPILE, see link (above)
WITH RECOMPILE AS
BEGIN
    SET NOCOUNT ON;

    SELECT *
    FROM ...
    WHERE 
        Col1    =   CASE 
                        WHEN @FilterBy = 1 THEN @Value1
                        ELSE Col1
                    END
    AND
        1       =   CASE
                        WHEN @FilterBy = 2 AND Col2 > @Value1 AND Col3 < @Value2        THEN 1
                        WHEN @FilterBy = 2 AND NOT (Col2 > @Value1 AND Col3 < @Value2)  THEN 0
                        ELSE 1
                    END 
END