首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >产品生命周期的Server视图创建

产品生命周期的Server视图创建
EN

Stack Overflow用户
提问于 2011-08-15 20:38:38
回答 2查看 379关注 0票数 2

免责声明:目前我们正在运行较旧的Server 2000,但我们可以在今后6个月左右更新到Server 2008。

在我们的制造环境中,我有一段非常长的C#代码来确定以下内容:

  1. 哪个员工“拥有”该产品(定义为第一个在其上工作的员工),
  2. 该产品的最终Test_Result是在压力测试站,以及
  3. 该产品的第一个Test_Result是在真空测试站。

所有Test_Result值(存储在字符串值中)都包含在从旧的Microsoft电子表格演变而来的平面文件表中。数据库结构可以很容易地修改,而不是,因为公司机器和供应商机器都会向它们写入数据。

每个月左右,管理层都会发布一份报告,显示每个员工拥有多少产品,如果第一次压力测试成功了,以及最终的真空测试是否成功的话。

目前,我的技术都是用来自SQL代码的C#调用实现的:

  • SELECT DISTINCT Serial_Number WHERE Date_Time BETWEEN @Date1 AND @Date2

在一个月的时间里,我们可以记录1500到3500种不同的产品Serial_Number值。

对于每个Serial_Number,我创建一个自定义Product类的实例,其中包含一个PressureEmployee和一个VacuumEmployee,它们都初始化为NULL

  • 现在,对于每个Product实例,我选择Date_Time字段中的所有数据和顺序,以确定哪个雇员首先在产品上执行测试操作。

这方面的SQL类似于以下准代码:

代码语言:javascript
复制
string sqlText = "SELECT Date_Time, Employee, System_ID, Test_Result " +
  "FROM Production " +
  "WHERE Serial_Number=@SN ORDER BY Date_Time";
using (SqlCommand cmd = new SqlCommand(sqlText, new SqlConnection(connStr))) {
  cmd.Parameters.Add("@SN", SqlDbType.NVarChar, 20);
  cmd.Connection.Open();
  foreach (var item in productList) {
    cmd.Parameters["@SN"].Value = item;
    SqlDataReader r = cmd.ExecuteReader();
    while (r.Read()) {
      string systemId = r["System_ID"].ToString();
      string testResult = r["Test_Result"].ToString();
      if (-1 < systemId.IndexOf("pressure")) {
        if (String.IsNullOrEmpty(item.PressureEmployee)) {
          item.PressureEmployee = r["Employee"].ToString();
        }
        // check that product ever passes
        if (-1 < testResult.IndexOf("pass")) {
          item.VacuumPass = true;
        }
      }
      if ((-1 < systemId.IndexOf("vacuum")) &&
          String.IsNullOrEmpty(item.VacuumEmployee)) {
        item.VacuumEmployee = r["Employee"].ToString();
        // product passes 1st time
        item.VacuumPass = (-1 < testResult.IndexOf("pass"));
      }
    }
  }
}

其实还有很多更多的东西,但是它应该能让大家都明白。

我想要做的是创建一个可以驻留在服务器上的视图,该视图只包含每个Serial_NumberPressure_Test结果、Pressure_Test日期、Vacuum_Test结果和Vacuum_Test日期的列表。

如果我的想法是正确的,这将减少服务器上的工作,因为它将始终维护此视图。此外,视图应该更快地执行...right吗?

那么,我怎么写这样的观点呢?

如果它不能更快,那么在查询运行时是否有任何方法获取查询的状态?显示Cursor = Cursors.WaitCursor 40分钟并不会给我的应用程序带来很大的信心。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-15 20:50:05

并不是真正的-默认情况下,视图不是由Server维护的-视图只是将合并到查询中的SQL语句片段。在这里没有任何表现..。

您可以研究索引视图,这些视图确实是“维护”的,因为它们的数据值存储在磁盘上,就像表一样。

  • 使用索引视图提高性能
  • Server 2000中的索引视图

他们有一长串的要求和限制--但如果你与之相匹配,这可能会更快一些--代价是使用更多的磁盘空间。你在这里也没有免费的午餐。

票数 2
EN

Stack Overflow用户

发布于 2011-08-15 20:58:46

如果要传递参数,则存储过程可能比视图提供的服务更好。

代码语言:javascript
复制
CREATE PROCEDURE dbo.myProc
(@SN int)
AS
BEGIN
   SELECT 
      Date_Time, 
      Employee, 
      System_ID, 
      Test_Result,
      CASE WHEN CHARINDEX('Pressure', System_ID) > 0 THEN Employee ELSE '' END as PressureEmployee,
      CASE WHEN CHARINDEX('pass', Test_Result) > 0 THEN 1 ELSE 0 END as VacuumPass
   FROM Production
   WHERE Serial_Number = @SN 
   ORDER BY Date_Time
END

您的C#可以很好地处理这个问题(而不是sqltext,您将使用‘ll命令)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7070560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档