求优化CLR的执行速度,分不够可以再加 120jiangchuandong]

发布时间:2016-12-6 22:11:22 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"求优化CLR的执行速度,分不够可以再加 120jiangchuandong]",主要涉及到求优化CLR的执行速度,分不够可以再加 120jiangchuandong]方面的内容,对于求优化CLR的执行速度,分不够可以再加 120jiangchuandong]感兴趣的同学可以参考一下。

using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using System.Text; using Microsoft.SqlServer.Server; public partial class StoredProcedures { #region GetDocNoComSqlProcedure /// <summary> /// 存储过程主函数 /// </summary> /// <param name="TableName">獲取流水号的TableName</param> /// <param name="colName">传入健值</param> /// <param name="StartDate">獲取的时间</param> /// <param name="OtherKey">其他健值</param> /// <param name="docLen">獲取的长度</param> /// <param name="docNo">输出流水号</param> [SqlProcedure]     public static void CLR_GetDocNoCom(string TableName,string colName ,string StartDate,string OtherKey,int docLen,out string docNo) { SqlConnection myConnection = new SqlConnection("context connection=true"); try { #region Definition DateTime StartDateValue;//開始時間 StringBuilder sb = new StringBuilder();//查询所用的StringBuilder string TempDocNo;//臨時DocNo #endregion myConnection.Open(); StartDateValue = FormatStartDate(StartDate); SqlDataReader dr_1 = GetCommonStartPrefix(TableName, colName, sb, myConnection); TempDocNo = FormatTempDocNo(dr_1, StartDateValue, StartDate, TableName, colName, OtherKey, docLen, sb, myConnection); docNo = TempDocNo; } catch(Exception ex) { if (ex.Message == "Initial Doc No # not set. Please set the Doc No") { SqlContext.Pipe.Send("Initial Doc No # not set. Please set the Doc No"); } else { SqlContext.Pipe.Send("Expected Doc No not gained !"); } docNo = string.Empty; } finally { myConnection.Close(); } } #endregion #region Function /// <summary> /// 格式化TempDocNo /// </summary> /// <param name="dr">传入CommonStartPrefix信息</param> /// <param name="StartDateValue">开始时间</param> /// <param name="StartDate">TempDocNo</param> /// <param name="TableName">獲取TableDate名</param> /// <param name="colName">獲取的健名</param> /// <param name="OtherKey">其他健名</param> /// <param name="docLen">长度</param> /// <param name="sb">构造sql的StringBuilder對象</param> /// <param name="myConnection">連接Connection</param> /// <returns>返回值</returns> private static string FormatTempDocNo(SqlDataReader dr, DateTime StartDateValue, string StartDate, string TableName, string colName, string OtherKey, int docLen, StringBuilder sb, SqlConnection myConnection) { string strTempDocNo = string.Empty; //存儲臨時TempDocNo的值 string strReGen = string.Empty; bool isAlpha = false;               //需要格式化流水號 string strKeyName = string.Empty;    //定義流水的keyName  string strLength = string.Empty;    //定義流水的長度2  string strColValue = string.Empty;    //定義流水的属性值 string sqlwhere = Convert.ToDateTime(StartDate).ToString("yyyy-MM-dd");//需要查詢的日期. string startValue = string.Empty; //獲DocNo的取开始值      if (dr.Read()) { if (!dr.IsDBNull(0)) { #region 如果CommonStartPrefix有值按PrefixOrder格式化日期 string strPrefixOrder = dr["PrefixOrder"].ToString();//前缀PrefixOrder isAlpha = Convert.ToBoolean(dr["isAlpha"]); if (strPrefixOrder.Length != 0) { for (int i = 0; i < strPrefixOrder.Length; i++) { if (strPrefixOrder.Substring(i, 1) == "1") { strTempDocNo = strTempDocNo + dr["Prefix1"].ToString(); } else if (strPrefixOrder.Substring(i, 1) == "2") { strTempDocNo = strTempDocNo + dr["Prefix2"].ToString(); } else if (strPrefixOrder.Substring(i, 1) == "3") { strTempDocNo = strTempDocNo + dr["Prefix3"].ToString(); } else if (strPrefixOrder.Substring(i, 1) == "y") { string strPrefix = dr["Prefixy"].ToString().ToLower(); if (strPrefix == "yy") { strTempDocNo = strTempDocNo + FormatYearByYY(StartDateValue); } else if (strPrefix == "yyyy") { string TempYear = StartDateValue.Year.ToString().TrimEnd(); strTempDocNo = strTempDocNo + TempYear.Substring(TempYear.Length - 4, TempYear.Length); strReGen = "year"; } } else if (strPrefixOrder.Substring(i, 1) == "m") { if (dr["PrefixM"].ToString() == "m") { strTempDocNo = strTempDocNo + FormatMonthByM(StartDateValue); } else if (dr["PrefixM"].ToString() == "mm") { string TempMonth; TempMonth = "0" + StartDateValue.Month.ToString(""); strTempDocNo = strTempDocNo + TempMonth.Substring(TempMonth.Length - 2, 2); strReGen = "month"; } } else if (strPrefixOrder.Substring(i, 1) == "d") { if (dr["PrefixD"].ToString().ToLower() == "d") { strTempDocNo = strTempDocNo + FormatDayD(StartDateValue); } else if (dr["PrefixD"].ToString().ToLower() == "dd") { string TempDay; TempDay = "0" + StartDateValue.Day.ToString(""); strTempDocNo = strTempDocNo + TempDay.Substring(TempDay.Length - 2, 2); strReGen = "day"; } } } } #endregion } } dr.Close();

#region 如果沒有值按流水號生成值 if (docLen == 0 && colName.ToString().Trim() != "") { docLen = GetDocLen(TableName, colName, sb, myConnection);    //定義流水的長度  } SqlDataReader dr_2 = GetKey(TableName, colName, docLen, sb, myConnection); // if (dr_2.Read()) { strKeyName = dr_2["keyName"].ToString(); docLen = Convert.ToInt32(dr_2["Length"]); } dr_2.Close(); int RecCnt = GetCommonStartCount(sb, TableName, colName, OtherKey, sqlwhere, StartDate, TableName, colName, docLen, myConnection);//獲取当天RecCnt的值 startValue = GetsqlSelectStart(sb, TableName, docLen, colName, OtherKey, StartDate, myConnection); //RecCnt = GetSelectTableCount(sb, TableName, colName, startValue, OtherKey, myConnection); //因为StringBuilder的原因构造sqlUpdateStart,sqlSelectTable放在后面构造        while (RecCnt > 0 || startValue == string.Empty) { startValue = GetsqlSelectStart(sb, TableName, docLen, colName, OtherKey, StartDate, myConnection); startValue = GetIsAlphaChar(isAlpha, startValue, docLen, strTempDocNo); GetsqlUpdateStart(sb, TableName,colName,  OtherKey, sqlwhere, myConnection); RecCnt = GetSelectTableCount(sb, TableName, colName, startValue,OtherKey ,myConnection); } strTempDocNo = startValue; #endregion return strTempDocNo; } /// <summary> /// 獲取CommonStartPrefix相關信息 /// </summary> /// <param name="TableName">需要處理的Table</param> /// <param name="colName">處理的字段</param> /// <returns>返回CommonStartPrefix相關信息</returns> private static SqlDataReader GetCommonStartPrefix(string TableName, string ColName, StringBuilder sb, SqlConnection myConnection) { SqlCommand cmd = new SqlCommand(); sb.Append("select PrefixOrder,IsAlpha,TableName as ViewRef,Prefix1,Prefix2,Prefix3,PrefixY,PrefixM,PrefixD from CommonStartPrefix where TableName = '"); sb.Append(TableName); sb.Append("' and isnull(ColName,'') = '"); sb.Append(ColName); sb.Append("'"); cmd.CommandText = sb.ToString(); cmd.Connection = myConnection; SqlDataReader dr = cmd.ExecuteReader(); sb.Remove(0, sb.Length); return dr;     } /// <summary> /// 格式化字符時間 /// </summary> /// <returns>返回格式化后的日期</returns> private static DateTime FormatStartDate(string StartDate) { if (StartDate == string.Empty) { StartDate = DateTime.Now.ToString("yyyy-MM-dd"); } else { StartDate = Convert.ToDateTime(StartDate).ToString("yyyy-MM-dd"); } return Convert.ToDateTime(StartDate); } /// <summary> /// 格式化YY格式的年份 /// </summary> /// <param name="TempPrefix">傳入YY格式</param> /// <returns>返回Y的格式</returns> private static string FormatYearByYY(DateTime StartDateValue) { string strYear  ;//返回Year值 strYear = string.Empty; strYear = TransferASCII(StartDateValue); return strYear; } /// <summary> /// 格式化M格式的月份 /// </summary> /// <param name="TempPrefix">傳入1位的月份</param> /// <returns>返回2位的月份</returns> private static string FormatMonthByM(DateTime StartDateValue) { string strMonth = string.Empty; if (StartDateValue.Month >= 10) { strMonth = Convert.ToString((char)(StartDateValue.Month + 55)); } else { strMonth = StartDateValue.Month.ToString() ; } return strMonth; } /// <summary> /// 格式化D格式的日期 /// </summary> /// <param name="TempPrefix">傳入D格式</param> /// <returns>返回Y的格式</returns> private static string FormatDayD(DateTime StartDateValue) { string strDay = string.Empty; int intLeftTemp;//返回TempYear的 intLeftTemp = StartDateValue.Day + 55; if (intLeftTemp - 55 >= 10) { if (intLeftTemp > 72) { if (intLeftTemp >= (int)'I') { intLeftTemp = intLeftTemp + 1; } if (intLeftTemp >= (int)'O') { intLeftTemp = intLeftTemp + 1; } if (intLeftTemp >= (int)'U') { intLeftTemp = intLeftTemp + 1; } if (intLeftTemp >= (int)'V') { intLeftTemp = intLeftTemp + 1; } } strDay = Convert.ToString((char)intLeftTemp); } else { strDay =  StartDateValue.Day.ToString(); } return strDay; }

/// <summary> /// 格式化YY格式的年份 /// </summary> /// <param name="TempPrefix">傳入YY,DD格式</param> /// <returns>返回Y,D,M的格式</returns> private static string TransferASCII(DateTime TempChar) { string strTempChar;//返回Year值 string strRightTemp; //返回Year第一位 int intLeftTemp;//返回TempYear的 strTempChar = "000" + Convert.ToString(TempChar.Year - 1900).TrimStart(); strRightTemp = strTempChar.Substring(strTempChar.Length - 1, 1); strTempChar = strTempChar.Substring(strTempChar.Length - 3,3); intLeftTemp = int.Parse(strTempChar.Substring(0,2)) + 55;//从10开始变为A if (intLeftTemp - 55 >= 10) { if (intLeftTemp  >= 72)//减少判断次数,字母I之前不用判断 { if (intLeftTemp  >= (int)'I') { intLeftTemp = intLeftTemp + 1; } else if (intLeftTemp  >= (int)'O') { intLeftTemp = intLeftTemp + 1; } else if (intLeftTemp  >=(int)'U') { intLeftTemp = intLeftTemp + 1; } else if (intLeftTemp  >=(int)'V') { intLeftTemp = intLeftTemp + 1; }                 } strTempChar = Convert.ToString((Char)(intLeftTemp)) + strRightTemp;   } else { strTempChar = strRightTemp;         } return strTempChar; } /// <summary> /// 獲取流水號長度 /// </summary> /// <param name="ViewRef">需要獲取的視圖和表名</param> /// <param name="colName">列名</param> /// <returns>返回長度</returns> private static int GetDocLen(string viewRef, string colName,StringBuilder sb,SqlConnection myConnection) { int intDocLen = 0; SqlCommand cmd = new SqlCommand(); sb.Append("SELECT  a.prec FROM syscolumns a INNER JOIN sysobjects b ON a.id = b.id WHERE  b.name = '"); sb.AppendFormat(viewRef); sb.AppendFormat("'AND a.name = '"); sb.Append(colName); sb.Append("'"); cmd.CommandText = sb.ToString(); cmd.Connection = myConnection; SqlDataReader dr = cmd.ExecuteReader(); sb.Remove(0, sb.Length); if (dr.Read()) { intDocLen = Convert.ToInt32(dr["prec"]); } dr.Close(); return intDocLen; } /// <summary> /// 獲取流水號長度 /// </summary> /// <param name="ViewRef">需要獲取的視圖和表名</param> /// <param name="colName">列名</param> /// <returns>返回長度</returns> private static SqlDataReader GetKey(string viewRef, string colName, int intLen ,StringBuilder sb, SqlConnection myConnection) { SqlCommand cmd = new SqlCommand(); sb.Append("DECLARE  @KeyName nvarchar(50),@Length int,@OtherKey nvarchar(4000)"); sb.Append("DECLARE @kColName nvarchar(100), @kColPrec  int , @kColDesc nvarchar(4000), @kColValue nvarchar(4000), @sqlOtherKey nvarchar(4000), @fnXmlParserGetValueByName nvarchar(500) "); sb.Append("SET @fnXmlParserGetValueByName = dbo.fnBaseDbName() + '.dbo.fnXmlParserGetValueByName' "); sb.Append("SET @sqlOtherKey ='' "); sb.Append("BEGIN "); sb.Append(" DECLARE FindKeyCursor CURSOR  STATIC  FORWARD_ONLY"); sb.Append(" FOR ("); sb.Append("SELECT a.name, a.prec, CAST(d.value AS nvarchar(4000)) decs FROM (" ); sb.Append("syscolumns a INNER JOIN sysobjects b ON a.id = b.id ");  sb.Append("INNER JOIN sysindexkeys c ON a.colid = c.colid AND b.id = c.id AND c.indid = 1 "); sb.Append("LEFT OUTER JOIN ::fn_listextendedproperty('MS_Description', 'user', 'dbo', 'TABLE','"); sb.Append( viewRef); sb.Append("', 'column', DEFAULT) d ON a.name = d.objname COLLATE Chinese_Taiwan_Stroke_CI_AS "); sb.Append(") WHERE b.type = 'U' AND b.name = '"); sb.Append(viewRef); sb.Append("' UNION SELECT a.name, a.prec, CAST(d.value AS nvarchar(4000))  FROM ( "); sb.Append("syscolumns a INNER JOIN sysobjects b ON a.id = b.id "); sb.Append("LEFT OUTER JOIN ::fn_listextendedproperty('MS_Description', 'user', 'dbo', 'VIEW', '"); sb.Append(viewRef); sb.Append("', 'column', DEFAULT) d ON a.name = d.objname COLLATE Chinese_Taiwan_Stroke_CI_AS "); sb.Append(") WHERE b.type = 'V' AND b.name = '"); sb.Append(viewRef); sb.Append("') "); sb.Append(" OPEN FindKeyCursor "); sb.Append(" FETCH NEXT FROM FindKeyCursor INTO @kColName, @kColPrec , @kColDesc "); sb.Append(" WHILE @@FETCH_STATUS = 0 "); sb.Append(" begin"); sb.Append(" PRINT @kColName"); sb.Append(" IF CHARINDEX('<docno>',@kColDesc) >  0  OR  @@CURSOR_ROWS  =  1 "); sb.Append(" BEGIN"); sb.Append(" SET @KeyName = @kColName"); sb.Append(" SET @Length = @kColPrec"); sb.Append(" END else"); sb.Append(" BEGIN"); sb.Append(" EXEC @kColValue = @fnXmlParserGetValueByName  @OtherKey, @kColName"); sb.Append(" SET @sqlOtherKey = @sqlOtherKey + ' AND  ' [email protected] +'  =  '''+ IsNull(@kColValue, '') + ''''"); sb.Append(" END"); sb.Append(" FETCH NEXT FROM FindKeyCursor INTO @kColName, @kColPrec , @kColDesc"); sb.Append(" END"); sb.Append(" CLOSE FindKeyCursor"); sb.Append(" DEALLOCATE FindKeyCursor end"); sb.Append(" SET @KeyName = IsNull('"); sb.Append(colName);   sb.Append("', @KeyName)"); sb.Append(" SET @Length = IsNull("); sb.Append(intLen); sb.Append(", @Length) "); sb.Append("select @KeyName  KeyName  , @Length  Length  "); cmd.CommandText = sb.ToString(); cmd.Connection = myConnection; SqlDataReader dr = cmd.ExecuteReader(); sb.Remove(0, sb.Length); return dr; } /// <summary> /// 獲取流水號長度 /// </summary> /// <param name="ViewRef">需要獲取的視圖和表名</param> /// <param name="colName">列名</param> /// <returns>返回長度</returns> private static string GetColValue(string otherKey, string colName, StringBuilder sb, SqlConnection myConnection1) { string strColValue = string.Empty; myConnection1.Open(); SqlCommand cmd = new SqlCommand(); sb.Append("declare @a nvarchar(4000) exec @a=fnXmlParserGetValueByName "); sb.Append(otherKey); sb.Append(","); sb.Append(colName); sb.Append(" select @a as ColValue"); cmd.CommandText = sb.ToString(); cmd.Connection = myConnection1; SqlDataReader dr = cmd.ExecuteReader(); sb.Remove(0, sb.Length); if (dr.Read()) { strColValue = dr["ColValue"].ToString(); } dr.Close(); return strColValue; } /// <summary> /// 獲取流水號開始長度 /// </summary> /// <param name="sb">构造sql的StringBuilder對象</param> /// <param name="TableName">獲取TableDate名</param> /// <param name="colName">獲取的健名</param> /// <param name="OtherKey">其他健名</param> /// <param name="sqlWhere">年月日合</param> /// <param name="StartDateValue">開始時間</param> /// <param name="ViewRef">獲取流水的表名或視圖名</param> /// <param name="KeyName">字段健值</param> /// <param name="intLength">长度</param> /// <param name="myConnection">連接Connection</param> /// <returns>開始的長度</returns>     private static int GetCommonStartCount(StringBuilder sb, string TableName, string ColName, string OtherKey, string sqlWhere, string StartDate, string ViewRef, string KeyName,int intLength, SqlConnection myConnection) { int intRecCnt = 0; sb.Append(" SELECT Count(*)  RecCnt  "); sb.Append(" FROM CommonStart WHERE Upper(TableName) = Upper('"+ TableName +"') "); sb.Append(" AND Upper(IsNull(ColName, '''')) = Upper(IsNull('"+ ColName +"', '''')) "); sb.Append(" AND Upper(OtherKey) = Upper('" + OtherKey + "') and startdate ='" + StartDate + "'  "); SqlCommand cmd = new SqlCommand(); cmd.CommandText = sb.ToString(); cmd.Connection = myConnection; SqlDataReader dr = cmd.ExecuteReader(); sb.Remove(0, sb.Length); if (dr.Read()) { intRecCnt = Convert.ToInt32( dr["RecCnt"]); } dr.Close(); sb.Remove(0, sb.Length); if (intRecCnt == 0) { InsertCommonStart(sb, TableName, ColName, OtherKey, sqlWhere, StartDate); try { cmd.CommandText = sb.ToString(); cmd.ExecuteNonQuery(); sb.Remove(0, sb.Length); } catch { throw new Exception("Initial Doc No # not set. Please set the Doc No"); }      }             return intRecCnt;        }

/// <summary> /// 返回InsertCommonStart 的Sql /// </summary> /// <param name="sb">傳入StringBuilder對象</param> /// <param name="tableName">傳入Table</param> /// <param name="colName">傳入健值</param> /// <param name="otherKey">其他Key</param> /// <param name="sqlWhere">年月日合</param> /// <param name="StartDateValue">開始時間</param> private static void InsertCommonStart(StringBuilder sb, string tableName, string colName, string otherKey, string sqlWhere, string StartDateValue) { sb.Append(" INSERT INTO CommonStart (TableName , ColName, StartDate , StartValue, "); sb.Append(" OtherKey) Values ( "); sb.Append("'" + tableName + "',"); sb.Append("'" + colName + "',"); sb.Append("'" + StartDateValue + "',"); sb.Append(" 1,'" + otherKey  + "' ) "); } /// <summary> /// 根據Length獲取流水長度 /// </summary> /// <param name="sb">傳入StringBuilder對象</param> /// <param name="tableName">傳入Table</param> /// <param name="intlength">流水長度,由系統表取出</param> /// <param name="colName">傳入健值</param> /// <param name="otherKey">其他健值</param> /// <param name="sqlWhere">年月日合</param> private static string GetsqlSelectStart(StringBuilder sb, string tableName, int intlength, string colName, string otherKey, string startDate,SqlConnection myConnection) { string returnValue = string.Empty; sb.Append(" SELECT Right(Replicate(N'0',"); sb.Append(intlength); sb.Append(")+Cast(StartValue AS nvarchar),"); sb.Append(intlength.ToString()); sb.Append(") as StartValue "); sb.Append(" FROM CommonStart WHERE Upper(TableName)=Upper('"); sb.Append(tableName); sb.Append("') AND Upper(IsNull(ColName, '''')) "); sb.Append(" = Upper(IsNull('"); sb.Append(colName); sb.Append("', ''''))") ; sb.Append(" AND Upper(OtherKey) = Upper('" + otherKey + "') and startdate ='" + startDate + "'  "); SqlCommand cmd = new SqlCommand(sb.ToString(),myConnection); SqlDataReader dr = cmd.ExecuteReader(); if(dr.Read()) { returnValue = dr["StartValue"].ToString(); } dr.Close(); sb.Remove(0,sb.Length); return returnValue;         } /// <summary> /// 更新CommonStart /// </summary> /// <param name="sb">傳入StringBuilder對象</param> /// <param name="tableName">傳入Table</param> /// <param name="intlength">流水長度,由系統表取出</param> /// <param name="colName">傳入健值</param> /// <param name="otherKey">其他健值</param> /// <param name="sqlWhere">年月日合</param> /// <returns></returns> private static void GetsqlUpdateStart(StringBuilder sb,string tableName, string colName, string otherKey, string sqlWhere,SqlConnection myConnection) { sb.Append("  UPDATE CommonStart SET StartValue = StartValue + 1 "); sb.Append("  WHERE Upper(TableName) = Upper('"); sb.Append(tableName); sb.Append("') AND Upper(IsNull(ColName, '''')) = Upper(IsNull('"); sb.Append(colName); sb.Append("', ''''))  AND Upper(OtherKey) = Upper('"); sb.Append(otherKey); sb.Append("')   "); sb.Append(sqlWhere); SqlCommand cmd = new SqlCommand(sb.ToString(),myConnection); cmd.ExecuteNonQuery(); sb.Remove(0,sb.Length); //cmd.Dispose(); } /// <summary> /// 查詢table或視圖中是否已存在該值 /// </summary> /// <param name="sb">傳入StringBuilder對象</param> /// <param name="tableName">傳入Table</param> /// <param name="intlength">流水長度,由系統表取出</param> /// <param name="colName">傳入健值</param> /// <param name="otherKey">其他健值</param> /// <param name="sqlWhere">年月日合</param> /// <returns></returns> private static int GetSelectTableCount(StringBuilder sb,string viewRef, string keyName, string startValue,string sqlOtherKey, SqlConnection myConnnection) { int intValue = 0; sb.Append(" SELECT Count(*) as RecCnt FROM  "); sb.Append(viewRef); sb.Append(" WHERE "); sb.Append(keyName); sb.Append(" = '"); sb.Append(startValue ); sb.Append(sqlOtherKey); sb.Append("'"); SqlCommand cmd = new SqlCommand(sb.ToString(), myConnnection); SqlDataReader dr = cmd.ExecuteReader(); if (dr.Read()) { intValue = Convert.ToInt32(dr["RecCnt"]); } sb.Remove(0,sb.Length); dr.Close(); return intValue; } /// <summary> /// 轉換為字符處理 /// </summary> /// <param name="IsAlpha">是否要轉換字符</param> /// <param name="StartValue">開始值</param> /// <param name="Length">長度值</param> /// <param name="TempDocNo">系統前面產生的流水</param> /// <returns></returns> private static string GetIsAlphaChar(bool IsAlpha, string StartValue, int Length, string TempDocNo) { string Temp = string.Empty; if (IsAlpha) { string WaterNo = StartValue; string WaterNoChr = string.Empty; int WaterNoCnt = 0; while (WaterNoCnt < Length - TempDocNo.Length) { //int WaterNoDigit = int.Parse(((int.Parse(WaterNo)/Math.Pow(32,WaterNoCnt))%32).ToString()); int WaterNoDigit = int.Parse((int.Parse(WaterNo) % 32).ToString()); if (WaterNoDigit < 10) { WaterNoChr = WaterNoDigit.ToString(); } else { int TempWaterNoDigit = WaterNoDigit + 55; int TempWaterCharShift = 0; if (TempWaterNoDigit >= 72)//减少判断次数,字母I之前不用判断 { if (TempWaterNoDigit + TempWaterCharShift >= (int)'I') TempWaterCharShift = TempWaterCharShift + 1; if (TempWaterNoDigit + TempWaterCharShift >= (int)'O') TempWaterCharShift = TempWaterCharShift + 1; if (TempWaterNoDigit + TempWaterCharShift >= (int)'U') TempWaterCharShift = TempWaterCharShift + 1; if (TempWaterNoDigit + TempWaterCharShift >= (int)'V') TempWaterCharShift = TempWaterCharShift + 1; } WaterNoChr = Convert.ToString((char)(TempWaterNoDigit + TempWaterCharShift)); } WaterNoCnt++; } WaterNo = WaterNoChr; Temp = TempDocNo + WaterNo; } else { int StartIndex = Length - TempDocNo.Length; Temp = TempDocNo + StartValue.Substring(StartValue.Length - StartIndex, StartIndex); } return Temp; } #endregion };

介许多代码,晕了~

现在发现CLR写的存储过程 要比原存储过程执行时间要慢一些,原存储过程执行的时间平均在68毫秒左右,但是编写后大概要执行78毫秒;请朋友帮忙看看,那些需要优化处理

路过,帮顶

不知道 为什么 楼主 会 使用clr来写 托管的存储过程 不过要想托孤存储过程 达到非托管存储过程的 效率是 不可能的 因为多的 那层 封装 是肯定存在消耗的

路过,帮顶

to:hertcloud 自己的目的有2个 1 是利用IDE来提高开发和维护效率,特别是针对于存储过程中有复杂的逻辑运算 sql中一些比较复杂的写法,可以用c#来写,例如游标可以用datareader来写 2 是用clr在处理字符方面确实要优于存储过程,一个是编译执行的,一个是解释执行的 其他的比较可以看msdn WebCast视频 http://www.msdnwebcast.com.cn/CourseDetails.aspx?id=107 MSDN参考 http://www.microsoft.com/china/msdn/library/data/sqlserver/sqlclrguidance.mspx?mfr=true

C#写的存储过程语句多每句较长或中间运算的相对较快 其他确实比直接调数据库存储过程慢

比较困难。

不好意思,今天才发现你的短消息。 看了一下你的clr存储过程,性能提升的空间很小。如果你想对其进行优化,以达到t-sql的效率是很难的。而且你的这个功能模块就不应该用clr来写! 再来说说你的目的。 1、 是利用IDE来提高开发和维护效率,特别是针对于存储过程中有复杂的逻辑运算。sql中一些比较复杂的写法,可以用c#来写,例如游标可以用datareader来写。 (1)、使用clr确实可以提高使用.net作为开发语言的项目的开发效率。但是说提高维护效率,这一点不太能够认同。维护一般是由项目甲方的程序维护人员或乙方(开发方)的售后人员完成的。他们可能对数据库的t-sql了解较多(这也是入门要求),但是对.net的了解可能并不是很多。也就是说,使用clr存储过程需要维护人员同时了解数据库的t-sql和.net的知识。 (2)、存储过程需要复杂逻辑算法和t-sql中无法提供相关功能的时候,才建议使用clr存储过程。这是使用clr存储过程的最基本准则。你的clr存储过程,并不符合上述准则。 MSDN参考 http://www.microsoft.com/china/msdn/library/data/sqlserver/sqlclrguidance.mspx?mfr=true 这个链接中提供的例子,一般是大量使用了数组(不少是多维数组)。在t-sql中对数组的实现一般都是使用临时表或者表变量,实现起来比较麻烦。而对于多维数组、二叉链表等更复杂的算法来说,t-sql更是难以实现。而且整个例子中于数据库交互的地方并不多,基本都是算法逻辑。回过头来看看你的存储过程。可以说其中并没有复杂算法,只是一些对参数的格式化过程,这个使用clr存储过程实现,理由并不充分。 2 是用clr在处理字符方面确实要优于存储过程,一个是编译执行的,一个是解释执行的。 确实,这个是微软介绍的。但是对于你的整个功能模块来说,编译执行和解释执行的效率并不是主要的,可能这部分性能提升已经被clr代码的封装所带来的消耗掩盖了! 最后,希望能够站在整个系统的稳定性和伸缩性角度来对某项技术的使用进行审核。数据库软件的性能瓶颈一般是出现在数据库层面。而数据库最稀缺的资源是i\o、cpu和memory。使用clr存储过程,需要将一些本应在应用服务器上消耗的cpu资源转移到数据库服务器上。需要知道,数据库软件一般都是按照支持的cpu数收取费用的,因此数据库的cpu资源很难增加,但是应用服务器的cpu资源相对充裕。clr存储过程和t-sql存储过程都是需要放在数据库共享池中进行缓存,把本来应该在应用服务器上的.net算法作为clr存储过程会极大的增加数据库服务器的内存压力,我们知道32位操作系统单个进程最多只能使用2G内存。虽然3G开关和AWE可以带来更多的内存使用,但是这只是增加数据库的缓冲池容量,无法提升共享池容量。相对这些数据库稀缺资源,使用clr存储过程带来的网络资源的节省可以说是微不足道了(目前的GB网络已经大面积普及)。

(1)、使用clr确实可以提高使用.net作为开发语言的项目的开发效率。但是说提高维护效率,这一点不太能够认同。维护一般是由项目甲方的程序维护人员或乙方(开发方)的售后人员完成的。他们可能对数据库的t-sql了解较多(这也是入门要求),但是对.net的了解可能并不是很多。也就是说,使用clr存储过程需要维护人员同时了解数据库的t-sql和.net的知识。 其实我想说的是,维护方面,.Net提供的异常处理机制,调试环境更好些 (2)之前我写的存储过程和现在的比较,现在的代码流程更清晰和减少了重复查询操作,性能还是提升了不少,在本机环境生成流水100条,时间大概少了1/3左右 (3)这样开发肯定来说要求数据库管理员要多熟悉些CLR方面的知识了,这个是一个过程性的问题 (4)数据库服务器也可以考虑做负载平衡来缓解压力吧 (5)最后说下,这个应用最好是用在操作大数据量,返回少量数据的情况下使用比较好

最后我是用的fxcop来优化代码的

上一篇:sql2005中能有几个登陆用户名 10feixianxxx]
下一篇:为何在非服务器的操作系统中为何要安装msde? 10FlyDayDream]

相关文章

相关评论