【问题标题】:Creating a database view in code在代码中创建数据库视图
【发布时间】:2012-05-30 18:25:17
【问题描述】:

因此,我的任务是创建一个工具,让我们的用户可以创建他们自己的“工作清单”,他们可以使用这些“工作清单”来处理他们的数据。在我们的应用程序中,这些工作列表由 SQL 视图驱动,所以现在我的程序必须根据用户输入在我们的数据库中动态创建视图。我不喜欢这样,但现在我必须充分利用它,并集思广益解决这个问题的最佳方法。

基本上,我创建的每个视图都有一个相似的骨架,它有几个总是被拉出的列和几个总是发生的连接。根据用户的输入,我可以添加额外的 SELECT 列,如果需要访问添加的显示列,还可以添加额外的连接。

所以基本上现在我的代码看起来像这样......

string SQL = string.Format(@"CREATE VIEW {0}
                             AS
                             SELECT
                             Foo.A,
                             Bar.B,
                             {1}
                             FROM
                             Table
                             INNER JOIN Foo on Foo.ID = Table.FooID
                             INNER JOIN Bar on Bar.ID = Table.BarID
                             {2}", viewName, displayNames, extraJoins);
Database.ExecuteNonQuery(SQL);

出于显而易见的原因,我真的不喜欢这个。但是,我似乎找不到与使用 ADO 创建视图的参数化查询的等效项。我也许可以创建一个存储过程来做到这一点,但即使这样似乎也很草率。有什么合理的方法可以做这样的事情不会让我感到恶心吗?此外,我们正在使用 MS SQL,并且必须支持早在 2005 年。

【问题讨论】:

  • 为什么它们必须是 SQL 视图?每个用户的工作清单是否由相同的表组成并在这些表之间连接?从幼稚的角度来看,接受用户标识符的存储过程(或参数化查询)似乎可以工作。还是更复杂?您能否提供有关这些工作清单的更多详细信息?
  • @RussCam 这是对我们相当复杂的问题的一个相当简单的看法。创建这些工作列表的代码是由这些视图驱动的大杂烩。目前,要更改该代码的操作方式是不可信的(我将在下一个版本中推动它,但现在我被卡住了)。在我的示例中,Foo 和 Bar 始终是相同的表,但是用户可以从许多不同的表中选择什么,我已经有了一种机制来查找使用这些表所需的连接。

标签: c# sql-server sql-server-2005 ado.net


【解决方案1】:

与 DML 相比(如 SELECT / UPDATE / INSERT / DELETE)有 no support for parameters in DDL(也可参见 here)。所以基本上你要么将它隐藏在带有动态 SQL 的存储过程中,要么按照你描述的方式来做......

【讨论】:

  • 呃,这很不幸。如果有人可能已经想出了一个更聪明的方法来解决这个问题,我将暂时搁置这个问题,但如果没有,我会给你支票。
猜你喜欢
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
相关资源
最近更新 更多