【发布时间】:2013-08-30 07:37:09
【问题描述】:
好的,所以我正在尝试创建一个包含条件 WHERE 子句的存储过程。它使用初始化为 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
【问题讨论】:
-
附注:如果这是针对 SQL Server,您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
杰出的建议。非常感谢你。我以后会避免犯这个错误的! :)
标签: sql stored-procedures null conditional where