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)
我不会在视图上创建 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 关于使用此类查询的性能的博客。
您正在寻找的是动态 SQL:基于不同参数动态构建查询的能力。
一些很好的起点包括:
但是,需要注意的一件事是,无论何时您将最终用户输入传递到数据库查询中,您都可能容易受到 SQL 注入的攻击。一些资源:
归档时间: |
|
查看次数: |
4965 次 |
最近记录: |