代码之家  ›  专栏  ›  技术社区  ›  eych

为每个表或根据需要创建三个存储过程(select/update/insert)?

  •  1
  • eych  · 技术社区  · 15 年前

    使用ASP.NET、SQL Server 2008和WinServer2003

    我们有大约10张表,每个表有大约20个字段…

    我们有大约30个Web表单,其中每个表单使用来自某些/所有表的一些字段变体…

    根据所使用的表,每个窗体都有自己的数据集。但是,要创建该数据集,将对每个使用的表调用select*存储过程。通过表单/代码更新数据集,并为每个数据表调用一个通用的插入或更新存储过程,将每个字段作为参数传递。虽然膨胀了,但是每个表中只有3个存储过程被所有表单使用,相当于30个存储过程。

    是否建议仅使用表单所需的字段为每个表单创建自定义的select/update/insert存储过程…从而总共创建90个存储过程? 这个数字可能会随着表格的增加而增加…

    4 回复  |  直到 15 年前
        1
  •  1
  •   Josh Yeager    15 年前

    存储过程是否具有任何特殊功能,或者只是运行一些基本的硬编码语句,如“select*from table”?

    如果它们只运行基本语句,那么最好去掉存储过程并使用动态SQL。这将减少你必须做的维护工作。动态SQL的旧性能问题不再相关,因为SQL Server的缓存和编译系统现在好多了。安全性问题也已经过时了,因为您现在可以在动态查询中使用参数化。

        2
  •  1
  •   Paul Sasik    15 年前

    您应该重新考虑在UI和数据库之间如此紧密地实现biz逻辑概念。您和您的团队应该后退一步,分析您的系统需要哪些类型的业务对象,而不是映射到大量屏幕。每个biz对象都可以有crud-sps,但是很多显示内容都应该由少数视图处理(除非您的模型完全是愚蠢的)。

        3
  •  1
  •   Jonas Elfström    15 年前

    如果您真的需要一个SP(安全性?)那么你至少应该考虑使用 Merge .使用“合并”可以获得内置的upsert命令。

    “Upsert,什么?”:

    update myTable set Col1=@col1, Col2=@col2 where ID=@ID
    if @@rowcount = 0
    insert into myTable (Col1, Col2) values (@col1, @col2)
    
        4
  •  0
  •   Adriaan Stander    15 年前

    是否确实需要为此使用sp,或者您可以使用参数化查询。这将避免SP的增长,并将减少服务器对每个表单不需要的字段的通信量。

    使用专门的查询来执行select、insert和update语句,而不是使用常规的sp从多个表单执行这些操作。