Stored procedures 对从表中获取一条记录或所有记录的存储过程进行编码

Stored procedures 对从表中获取一条记录或所有记录的存储过程进行编码,stored-procedures,coding-style,Stored Procedures,Coding Style,我在这里寻找最干净的解决方案。 我想编写一个存储过程,如果在输入中传递了正确的键,则该存储过程应检索一条记录;如果在没有参数的情况下调用,则应检索所有记录 表FOO有两个字段:代码和说明。 在Sql server 2008中,我通常创建一个存储过程,如下所示: CREATE PROCEDURE getFoo @CODE CHAR(3)=NULL AS IF @CODE is NULL BEGIN SELECT CODE,DESCRIPTION FROM FOO END ELS

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

表FOO有两个字段:代码和说明。 在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
对于这个简单的任务,您首选的代码是什么? 您是否以友好的方式构建它,并在最后使用EXECUTE?
谢谢

我会像你那样做,或者有时(取决于我的心情)只是:


我不建议在这里或其他任何可以避免的地方构建动态字符串并执行它。它可能会对性能产生影响(但我不确定这是否正确),它使阅读变得困难,编译过程中编译时语法验证更少,系统依赖性的有用信息更少,而且(最糟糕的是)您可能会受到SQL注入攻击。

我会像您这样做,或者有时(取决于我的心情)只是:


我不建议在这里或其他任何可以避免的地方构建动态字符串并执行它。它可能会对性能产生影响(但我不确定这是否正确),它使阅读变得困难,在编译过程中编译时语法验证更少,关于系统依赖性的有用信息更少,而且(最糟糕的是)您可能会受到SQL注入攻击。

从您的代码中,我猜是TSQL,所以这里有一篇关于T-SQL中动态搜索条件的非常完整和广泛的文章,作者是Erland Sommarskog。这将表明没有一种正确的方法,这取决于许多因素


它涵盖了每种可能的方法的所有优点和缺点:

根据您的代码,我猜是TSQL,因此这里有一篇关于T-SQL中的动态搜索条件的非常完整和广泛的文章,由Erland Sommarskog撰写。这将表明没有一种正确的方法,这取决于许多因素


它涵盖了每种可能方法的所有优点和缺点:

仅供参考,SQL Server在使用此方法时将无法有效地使用索引。请参阅:仅供参考,使用此方法时SQL Server将无法有效地使用索引。见此:
SELECT CODE,DESCRIPTION 
FROM FOO 
WHERE CODE=@CODE OR @CODE IS NULL
SELECT CODE,DESCRIPTION FROM FOO WHERE CODE=ISNULL(@CODE,CODE)