好的,所以我试图创建一个包含条件WHERE子句的存储过程。它使用初始化为NULL的命名参数,然后根据它们在调用语句时是否仍为null或者是否具有值来确定是否将它们添加到WHERE语句。
该陈述的一个例子是:
CREATE PROCEDURE Sp_myconditionalproc (@xVariable VARCHAR(10) = NULL,
@yVariable VARCHAR(50) = NULL)
AS
BEGIN
SELECT *
FROM [MyDB].[dbo].[MYTABLE]
WHERE X = CASE
WHEN @xVariable <> NULL THEN @xVariable
ELSE X
END
AND Y = CASE
WHEN @yVariable <> NULL THEN @yVariable
ELSE Y
END
END
然后使用
调用它EXECUTE Sp_myconditionalproc
@xVariable = 'C',
@yVariable = 'AB';
出于某种原因,这不会返回我期待的结果。而不是给我xVariable是'C'的结果,它给了我所有的结果,无论xVariable是什么。与xVariable相同。基本上 - 无论我放在那里,都会返回整个表格。
这是我第一次尝试这样的事情,所以我可能会遇到一些巨大的缺陷,但我不知道它是什么。有人可以帮助我弄清楚我在这里做错了什么以及如何纠正它,这样我只能传入我想要搜索的变量?
谢谢! = d
答案 0 :(得分:1)
你对NULL如何工作有误解。
没有任何等于或不等于NULL
,因此@xVariable <> NULL
将永远是假的!
尝试使用ISNULL
以将NULL
替换为其他值,或与IS NULL
进行比较。
试试这个:
CREATE PROCEDURE Sp_myconditionalproc (@xVariable VARCHAR(10) = NULL,
@yVariable VARCHAR(50) = NULL)
AS
BEGIN
SELECT *
FROM [MyDB].[dbo].[MYTABLE]
WHERE X = CASE
WHEN @xVariable IS NOT NULL THEN @xVariable
ELSE X
END
AND Y = CASE
WHEN @yVariable IS NOT NULL THEN @yVariable
ELSE Y
END
END
或者这个:
CREATE PROCEDURE Sp_myconditionalproc (@xVariable VARCHAR(10) = NULL,
@yVariable VARCHAR(50) = NULL)
AS
BEGIN
SELECT *
FROM [MyDB].[dbo].[MYTABLE]
WHERE X = Isnull(@xVariable, X)
AND Y = Isnull(@yVariable, Y)
END
祝你好运!