幫你寫個
/// <summary>
        /// 根據時間生成流水號
        /// 流水號組成如XS200811050001
        /// XS:銷售
        /// 20081105:日期
        /// 0001:20081105日的第一個訂單
        /// </summary>
        /// <returns></returns>
        private string GetNumberString()
        {
            string orderNumber = null;
            //取得當天的最大訂單號
            DateTime now = DateTime.Now;
            string sql = "select max(convert(int,substring(OrderNumber,11,4))) from Orders where OrderNumber like 'XS" + now.Year.ToString("d4") + now.Month.ToString("d2") + now.Day.ToString("d2") + "%'";
            DataSet ds = null;
            using (DatabaseOperater2 op = new DatabaseOperater2())
            {
                ds = op.ExcuteSelectByAdater(sql);
            }
            if (ds.Tables[0].Rows[0][0] is DBNull)
            {
                //如果今天還沒有訂單
                orderNumber = "XS" + now.Year.ToString("d4") + now.Month.ToString("d2") + now.Day.ToString("d2") + "0001";
            }
            else
            {
                //如果有訂單,則在最大訂單號上+1
                int number = Convert.ToInt32(ds.Tables[0].Rows[0][0])+1;
                orderNumber = "XS" + now.Year.ToString("d4") + now.Month.ToString("d2") + now.Day.ToString("d2") + number.ToString("d4");
            }
            return orderNumber;
        }
『貳』 SQL怎樣自動生成編號格式如:GG+YYYYMMDD+4位流水編號
我的項目里也用到這種模式
但有點不好,靈活性太差,邏輯判斷都放在程序里,我剛寫的改進下。
CREATE PROC CreateMaxNum
(
  @NumberHeader NVARCHAR(40)  --號碼單頭類型
)
DECLARE @NumberHeader  NVARCHAR(40), --編號頭
        @NumberMiddle  CHAR(8),   --編號中間規則
        @MaxNum  CHAR(8),    --編號最大流水號
        @SQL NVARCHAR(4000)
SET @NumberMiddle= CONVERT(CHAR(8),GETDATE(),112) --設置中間編碼規則
SET @SQL = 'SELECT @Num=RIGHT(''0000''+LTRIM(MAX(RIGHT(號碼,4))+1),4) 
            FROM 號碼表
            WHERE 號碼 LIKE '''+ @NumberHeader+'%'' ';
EXEC sp_executesql @Sql,N'@Num NVARCHAR(40) OUTPUT',@MaxNum OUT
IF  @MaxNum IS NULL  --不存在該類型的號碼,插入流水號為1的號碼,
  BEGIN
     SELECT @NumberHeader + @NumberMiddle + '0001' 
  END
ELSE 
  BEGIN              --生成最大流水號
     SELECT @NumberHeader + @NumberMiddle + @MaxNum
  END
『叄』 求教sql server創建序列,生成流水號,急用 謝謝了
SEQ_HA_PERSON_INFO這個是什麼?
既然是流水號,為什麼又說由序列SEQ_HA_PERSON_INFO生成?
流水號不是一個個的增加上去的嗎?
真心不明白
 
不過實現的方法2種
1、觸發器在插入的時候生成
2、函數,插入前生成,或者插入時生成(直接在vaLues中寫上就好)
『肆』 怎麼生成流水號
目前是在.net中使用的這個方法,使用sqlserver的時間戳來控制並發情況下容易產生重復序列號的問題。
原理類似hibernate的主鍵生成機制,在系統啟動時從資料庫中讀出最大的流水號,賦給一個類的靜態變數,需要時,從該靜態變數中取得流水號,加1後,就是你要的值。
代碼:
public class testA {
public static Long maxNo;
static {
synchronized(maxNo){
maxNo = select max(maxNo) from DB;
}
}
public synchronized static long getMaxNo(){
return(++maxNo);
}
}
優點:保證同步,不會取到相同的值,同時避免了資料庫的反復讀取。
缺點:在cluster環境下
還是用上面的方法,但是只能在一台機器上發布並且綁定到JNDI,別的機器可以通過配置文件得知去哪裡產生maxNo(實際上,每台機器都可以發布,但是所有機器只能去訪問指定的一台機器),這樣的效率雖然低了點,但是還是覺得比每次去資料庫里取好點。當然,可以改進,就是再加一個本地類,每次去JNDI那裡的類去取數據時,一次取20個回來(就是JNDI上面的類一次要加20),以後本地就用這20個值,用完了,再去JNDI上面的類去取。
當然,前面的這兩個例子都比較復雜,甚至還有人提出用單態的方法。而我在.net中用的就比較簡單了。方法如下:
在資料庫(sqlserver)中新建一張表(sequence_num),專門用來生成流水號。
欄位1:s_id,varchar(50),notnull
欄位2:tmstmp,timestamp,notnull
代碼如下:
public string getOderid()
  {
private SqlConnection conn = null;
   private SqlCommand comm = null;
  
   private string s_id = "";
   private byte [] tmstmp;//時間戳類型在.net中對應為一個byte數組
   private int s_idplus = 0;
   private string orderid = "";
   try
   {
    conn = SqlConn.getConn();
    conn.Open();
    do
    {
     string sqlQuery = "select s_id,tmstmp as tmstmp from sequence_num";
     comm = conn.CreateCommand();
     comm.CommandText = sqlQuery;
     SqlDataAdapter da = new SqlDataAdapter(comm);
     DataTable dt = new DataTable();
     dt.Clear();
     da.Fill(dt);
comm.Parameters.Clear();
if (!dt.Rows[0]["s_id"].ToString().Substring(0,12).Equals(DateTime.Now.ToString("yyyyMMddHHmm")))//每一分鍾重置一次計數,實際上我認為每天重置一次比較好
     {
      s_id = DateTime.Now.ToString("yyyyMMddHHmm")+"0001";
      tmstmp = (byte[])dt.Rows[0]["tmstmp"];
     }
     else
     {
      s_id = dt.Rows[0]["s_id"].ToString();
      tmstmp = (byte[])dt.Rows[0]["tmstmp"];
s_idplus = Convert.ToInt32(s_id.Substring(12)) + 1;
      s_id = s_id.Substring(0,12)+Convert.ToString(s_idplus).PadLeft(4,'0');
     }
string sqlUpdate = "update sequence_num set s_id = @s_id where tmstmp = @tmstmp";//保證在記錄未被修改的情況下更新,如果更新不成功,則重走一遍生成序列號的流程
     comm.CommandText = sqlUpdate;
comm.Parameters.Clear();
comm.Parameters.Add("@s_id",SqlDbType.VarChar,50);
     comm.Parameters["@s_id"].Value = s_id;
     comm.Parameters.Add("@tmstmp",SqlDbType.Timestamp);
     comm.Parameters["@tmstmp"].Value = tmstmp;
    }
    while(comm.ExecuteNonQuery()<=0);
   }
   catch(SqlException ex)
   {
    string aaa = ex.Message;
   }
   finally
   {
    if(conn!=null)
    {
     conn.Close();
    }
   }
   return s_id;
  }
這個流程都是在.net里實現的,實際使用中可以通過存儲過程來實現。當然,這種方法對資料庫的訪問會比較頻繁,另外,資料庫表建立的時候必須插入一條初始值,這是代碼不完善的地方,有時間的話我會去完善它。只是判斷如果表內沒有記錄的情況下就插入一條初始記錄,這個時候如何處理並發問題還沒想明白。
