编写从表中获取单个记录或所有记录的存储过程

时间:2010-03-10 19:55:03

标签: stored-procedures coding-style

我在这里寻找最干净的解决方案。 我想编写一个存储过程,如果在输入中传递了正确的密钥,则应检索一条记录;如果没有参数,则调用所有记录。

表FOO有两个字段,CODE和DESCRIPTION。 在Sql server 2008中,我通常用这样创建一个存储过程:

CREATE PROCEDURE getFoo 
@CODE CHAR(3)=NULL
AS
IF @CODE is NULL 
  BEGIN
    SELECT CODE,DESCRIPTION FROM FOO
  END
ELSE
  BEGIN
    SELECT CODE,DESCRIPTION FROM FOO WHERE CODE=@CODE
  END
GO

我的解决方案的主要问题显然是SELECT的重复,如果表有很多字段或者有很多连接到其他表,那可能会很痛苦。

我在其他SP中看到的另一种方法是:

CREATE PROCEDURE getFoo 
@CODE CHAR(3)=NULL
AS
DECLARE @FILTER CHAR(3)
SET NOCOUNT ON
IF @CODE is NULL SET @Filtro='%'
ELSE SET @FILTER =@CODE 

SELECT CODE,DESCRIPTION
FROM FOO
WHERE
CODE like @FILTER
GO

这项简单任务的首选代码是什么? 你是用dinamically构建它并在最后使用EXECUTE吗? 感谢

3 个答案:

答案 0 :(得分:2)

从您的代码中,我猜测TSQL,因此这是一篇关于Erland Sommarskog的T-SQL动态搜索条件的非常完整且相当广泛的文章。它将表明没有一种正确的方法,这取决于很多因素。

它涵盖了所有可能方法的所有PRO和CON:http://www.sommarskog.se/dyn-search.html

答案 1 :(得分:1)

我会做你做过的,有时候(取决于我的心情):

SELECT CODE,DESCRIPTION FROM FOO WHERE CODE=ISNULL(@CODE,CODE)

我不建议构建动态字符串并执行它,在这里或其他任何地方都可以避免。它可能具有性能影响(但我不确定它是多么真实),它使得难以阅读,在编译proc时获得较少的编译时语法验证,您获得的有关系统依赖性的有用信息较少,而且(最糟糕的是)你可以打开自己的SQL注入攻击。

答案 2 :(得分:0)

SELECT CODE,DESCRIPTION 
FROM FOO 
WHERE CODE=@CODE OR @CODE IS NULL