【发布时间】:2010-12-12 07:08:21
【问题描述】:
我在这里分享对以下场景的综合分析:
我有一个“项目”表,并且我有一个搜索 SP。我希望能够搜索多个 ItemCode,例如:
- Table structure : Item(Id INT, ItemCode nvarchar(20))
- Filter query format: SELECT * FROM Item WHERE ItemCode IN ('xx','yy','zz')
我想使用存储过程动态地执行此操作。我将传递一个@ItemCodes 参数,该参数将具有逗号(',') 分隔值,并按上述方式执行搜索。
嗯,我已经访问了很多帖子\论坛,这里有一些主题:
- 动态 SQL 可能是最简单的方式,但我不想考虑它,因为性能、安全性(SQL 注入等)等参数......
还有其他方法,如 XML 等。如果它们使事情变得复杂,我将无法使用它们。
最后,请不要使用额外的临时表 JOIN 类的性能技巧。 我必须管理性能和复杂性。
Passing an "in" list via stored procedure 我已经查看了上述两篇文章并通过了一些提供的解决方案,这里有一些限制:
http://www.sommarskog.se/arrays-in-sql-2005.html 这将要求我在将参数类型传递给 SP 时“声明”参数类型,这会扭曲抽象(我没有在我的任何参数中设置类型,因为它们中的每一个都以通用方式处理)
http://www.sqlteam.com/article/sql-server-2008-table-valued-parameters 这是一种结构化方法,但它增加了复杂性,需要更改 DB 结构级别,并且不像上面那样抽象。
http://madprops.org/blog/splitting-text-into-words-in-sql-revisited/ 好吧,这似乎与我的旧解决方案相匹配。这是我过去所做的 -
I created an SQL function : [GetTableFromValues] (returns a temp table populated each item (one per row) from the comma separated @ItemCodes)
而且,这就是我在 SP 的 WHERE caluse 过滤器中使用它的方法 -
SELECT * FROM Item WHERE ItemCode in (SELECT * FROM[dbo].[GetTableFromValues](@ItemCodes))
这个是可重复使用的,看起来简单而简短(当然是相对而言的)。我错过的任何东西或任何有更好解决方案的专家(显然“在”上述几点的限制内)。
谢谢。
【问题讨论】:
-
好吧,许多专家以及许多论坛帖子都建议我直接从应用程序中使用动态 T-SQL .. 与部署 SP 具有相同的好处!!!这使我的问题颠倒过来,我可以摆脱一个完整的动态 SQL 生成,并从我的应用程序代码中实际“创造奇迹”.. 这听起来是一个公平的想法吗?
-
bloggingabout.net/blogs/adelkhalil/archive/2008/01/06/… --------------------------------------- ------------ codingefficiency.com/2009/08/03/…
-
我知道你是从性能的角度来看这个的,但是在应用程序中保持动态查询构造的另一个很好的理由是在 SP 中使用 TSQL 执行它是丑陋的并且难以维护.如果你真的想使用 SP,我认为最好的方法是使用 GetTableFromValues UDF,因为这确实避免了在 SP 中编写动态 SQL。
标签: sql sql-server filtering csv