【发布时间】:2014-05-08 20:09:11
【问题描述】:
我正在开发一个存储过程,该过程用于根据用户输入的条件过滤网格。在可能的标准中,他们可能会选择查看在某个开始日期和结束日期之间完成的交易。我将 4 个输入参数传递给 proc - @ClientKey,客户端请求信息,@FilterBy(这是从 ASP.NET 的下拉列表中选择的值,基本上告诉 proc 用户是否选择按名称过滤,地址、日期等。在这种情况下,日期的@FilterBy 值为 5)、@Value1,在这种情况下是开始日期,@Value2 在这种情况下是结束日期。
在伪代码中,我想要的是:
选择 ABunchOfColumns FROM SomeJoinedTables WHERE SomeCriteria 和案例@FilterBy WHEN 5 THEN d.TransactionTime >= CAST(@Value1 AS Date) AND d.TransactionTime
以下是完整的查询。我希望比我更精通 SQL 的人能够理清我正在尝试做的事情并提供解决方案。
提前致谢!
@ClientKey int,
@FilterBy int,
@Value1 varchar(150),
@Value2 varchar(150)
作为 开始
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
结束
【问题讨论】:
标签: sql sql-server tsql stored-procedures