带有可选参数的存储过程

Ski*_*eak 1 sql-server stored-procedures

我有一个视图,它抓取了我希望能够搜索的大量数据。视图设置了以下列:

Part_Number、说明、信息、供应商、制造商、类别、子类别、货币、价格、折扣。

我希望创建一个存储过程,它可以让我在视图中搜索我专门查找的数据。就像是:

SELECT * FROM PartsData
WHERE Part_Number = '0010.05.20.20'
Run Code Online (Sandbox Code Playgroud)

现在我的第一个想法是设置过程,以便它寻找的唯一参数是 a VARCHAR,它基本上包含整个WHERE子句的内容。这听起来像是行得通的。

但是,我是否可以使用可选参数设置存储过程?我不确定这是否是您可以在 SQL 中执行的操作。

如果没有,我最初的实施想法是我最好的选择吗?因为看起来应该有更好的方法来做到这一点。:\

有时WHERE子句可能很长,例如:

WHERE Description LIKE '%cap' 
AND Supplier LIKE 'A2A Systems' 
AND Manufacturer LIKE 'Vario'
Run Code Online (Sandbox Code Playgroud)

scs*_*mon 7

我不会在视图上创建 proc,而是只针对底层查询本身使用 proc。

在您的示例中,您使用LIKE而不是=which 为混合物增加了一定程度的复杂性。通常可以这样处理:

WHERE 
(Description = @desc or @desc is null)
AND (Supplier = @supplier or @supplier is null)
AND (Manufacturer = @manufacturer or @manufacturer is null)
Run Code Online (Sandbox Code Playgroud)

随着LIKE你必须以连接%的前后端(或只是一端如果就足够了)。布伦特 (Brent) 有一篇关于 LIKE 性能的帖子

WHERE 
(Description like '%' +  @desc + '%' or @desc is null)
AND (Supplier = '%' + @supplier + '%' or @supplier is null)
AND (Manufacturer = '%' + @manufacturer + '%' or @manufacturer is null)
Run Code Online (Sandbox Code Playgroud)

最后,这通常称为厨房水槽查询,或捕获所有查询。这是 Aaron 关于使用此类查询的性能的博客。


Bre*_*zar 7

您正在寻找的是动态 SQL:基于不同参数动态构建查询的能力。

一些很好的起点包括:

但是,需要注意的一件事是,无论何时您将最终用户输入传递到数据库查询中,您都可能容易受到 SQL 注入的攻击。一些资源: