【发布时间】:2015-08-13 23:00:59
【问题描述】:
好吧,我正式不知所措了。我正在尝试创建一个贯穿每个后续检查并执行相应查询的过程。
但是,当我使用一个/两个/所有参数执行该过程时,它总是会在最终的 ELSE 中被捕获并吐出“覆盖所有”结果集。为什么???
我怀疑它可能是: -If/Else 语法 - 括号的使用 - 开始/结束关键字 - IF 条件太多?
非常感谢任何帮助!
加分项:我可以在 WHERE 子句中使用搜索的 CASE 来优化它吗?我知道我真的可以减少这段代码——但我真的很好奇为什么这不起作用。
CREATE PROC spBalanceRange
@VendorVar varchar(50) = NULL,
@BalanceMax money = NULL,
@BalanceMin money = NULL
AS
IF
(
@VendorVar != NULL
AND @BalanceMin != NULL
AND @BalanceMax != NULL
)
BEGIN
SELECT VendorName, InvoiceNumber, InvoiceTotal - (PaymentTotal + CreditTotal) AS BalanceDue
FROM Invoices JOIN Vendors
ON Invoices.VendorID = Vendors.VendorID
WHERE
VendorName = @VendorVar
AND InvoiceTotal - (PaymentTotal + CreditTotal) >= @BalanceMin
AND InvoiceTotal - (PaymentTotal + CreditTotal) <= @BalanceMax
END
ELSE IF
(
@VendorVar != NULL
AND @BalanceMin = NULL
AND
(
@BalanceMax = NULL
OR @BalanceMax = 0
)
)
BEGIN
SELECT VendorName, InvoiceNumber, InvoiceTotal - (PaymentTotal + CreditTotal) AS BalanceDue
FROM Invoices JOIN Vendors
ON Invoices.VendorID = Vendors.VendorID
WHERE
VendorName = @VendorVar
AND InvoiceTotal - (PaymentTotal + CreditTotal) > 0
END
ELSE
BEGIN
SELECT VendorName, InvoiceNumber, InvoiceTotal - (PaymentTotal + CreditTotal) AS BalanceDue
FROM Invoices JOIN Vendors
ON Invoices.VendorID = Vendors.VendorID
WHERE
InvoiceTotal - (PaymentTotal + CreditTotal) > 0
END
;
【问题讨论】:
-
没有什么等于 NULL,也没有什么不等于 NULL。您需要使用
IS NULL和/或IS NOT NULL。这些是处理正常规则的特殊运算符;任何涉及 NULL 的操作都会导致 NULL,包括相等和不相等。 (1 = NULL不会产生 FALSE,它会产生 NULL。而NULL = NULL不会产生 TRUE,它会产生 NULL。) -
该死!!一直以来,我都不知道。我真的很感激!
标签: sql-server if-statement case