有没有办法根据条件选择不同的列?

时间:2011-03-30 06:25:11

标签: sql stored-procedures

编辑以消除歧义:在MVC中查看,而不是数据库视图。

您好,

每次开发数据库驱动的应用程序时,我都面临着设计决策。假设我有一个表X,我想根据视图获取不同的列。一个视图可能需要一个列,另一个视图我需要所有列。

我目前正在做的是拥有一个返回所有列select * from X的存储过程,并根据视图绑定列。我不相信这是正确的方法,因为我选择了不必要的列,数据库很大,流量也在增加。

采用这种设计的最佳方法是什么?我应该保持1 SP方式还是每个视图都有一个存储过程(每个SP返回不同的列)。有没有可能有用的设计模式?我考虑过为SP指定列,但由于我必须跟踪每个视图的columns参数,因此它会使维护成为一场噩梦。

谢谢。

3 个答案:

答案 0 :(得分:1)

如果您使用存储过程进行数据访问,那么我更倾向于每个视图使用一个存储过程。您甚至可以引入一个约定,使得过程名称和视图名称具有某种形式的1-1对应关系。

这意味着您可以轻松确定每个视图使用哪个存储过程。这也意味着您可以在每个过程中应用合适的(不同的)过滤器,传递不同的参数等。

我假设您正在进行直接数据库访问,而不是使用某种形式的ORM或DAL。大多数这些系统,如果它们对存储过程有强大的支持,则建立在存储过程将始终返回具有相同“形状”(即相同列)的结果集的前提下。

答案 1 :(得分:0)

您可以将参数传递给SP,以识别要检索的列的列表,并动态执行该语句并返回。

你可以用两种不同的方式做到:

  • 将列表作为字符串传递给存储过程。跟踪访问内容是不安全和困难的
  • 传递表示要检索的列列表的id。此id可用于查找存储最相关列集的配置表(当然不是所有可能的子集)。它更安全,更易于管理。

答案 2 :(得分:0)

根据存储过程的参数,您可以使用CASE语句返回不同的值(来自不同的列)。但是,实际的列名称是固定的。

伪代码:

procedure get_stuff (@p_what varchar)
as
begin

  select case @p_what
      when 'NAME' then t.name
      when 'DESCR' then t.description
      else null
    end as the_column
  from my_table t

end