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

时间:2011-08-15 20:38:39

标签: c# sql-server view

[免责声明]:目前我们正在运行较旧的SQL Server 2000,但我们可能会在未来6个月内更新到SQL Server 2008.

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

  1. 哪个员工“拥有”该产品(定义为第一个使用该产品的员工),

  2. 该产品的最终Test_Result位于压力测试工作站,

  3. 该产品的第一个Test_Result位于真空测试站。

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

    每隔一个月左右,管理层会运行一份报告,显示每个员工拥有的产品数量,第一次压力测试是否成功,以及最终 < strong>真空测试取得了成功。

    我目前使用SQL来自C#代码的SELECT DISTINCT Serial_Number WHERE Date_Time BETWEEN @Date1 AND @Date2来电的所有技巧都是:

    • Serial_Number

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

    对于每个Product,我创建了一个自定义PressureEmployee类的实例,其中包含VacuumEmployeeNULL,两者都初始化为Product。< / p>

    • 现在,对于每个Date_Time个实例,我选择所有数据并按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")); } } } } 字段排序,以确定哪个员工首先对产品执行了测试操作。

    SQL的类似于以下准代码:

    Serial_Number

    实际上还有更多内容,但它应该得到一般性的想法。

    我想要做的是创建一个可以驻留在服务器上的视图,该视图只包含每个Pressure_TestPressure_Test结果,Vacuum_Test日期,结果Vacuum_TestCursor = Cursors.WaitCursor日期。

    如果我的想法是正确的,那么在服务器上的工作就会减少,因为它会始终保持这个视图。此外,视图应该执行得更快......对吗?

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

    如果速度不快,有没有办法在查询运行时获取状态?显示{{1}} 40分钟并不会对我的申请充满信心。

2 个答案:

答案 0 :(得分:2)

不是 - 默认情况下,SQL Server不会对维护视图 - 视图只是将包含在查询中的SQL语句片段。这里没有性能提升.....

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

他们有很长的要求和限制清单 - 但是如果你匹配那些,这可能会快得多 - 以使用更多磁盘空间为代价。你在这里得不到任何免费午餐......

答案 1 :(得分:1)

如果要传递参数,存储过程可能比视图更好。

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,你将使用sqlcommand)。