我是靠谱客的博主 端庄小鸭子,最近开发中收集的这篇文章主要介绍流水号生成存储过程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- =============================================
-- Author:  <>
-- Create date: <2008-11-11>
-- Description: <流水号生成存储过程>
-- Description: <传入参数为要生成流水号的表的表名,输出参数为流水号>
-- =============================================
CREATE PROCEDURE [dbo].[GetSerialNumber]
@TableName varchar(50),     --传入要查询的表名
@Result varchar(50) OUTPUT  --返回的流水号
AS
BEGIN
----根据传入的表名,查询出需要的参数
 --declare @TableName varchar(50)
 --set @TableName = 'A010'
 declare @setId varchar(4)    --查询表名
 declare @keyType char(1)     --类型,默认1的才可以查询
 declare @keyTag varchar(10)  --查询前缀名称
 declare @keyYear int         --查询年长度
 declare @keyMonth int        --查询月长度
 declare @keyDay int          --查询日期长度
 declare @keyNumLen int       --查询后缀长度

 select @setId=setId,@keyTag=keyTag,@keyType=keyType,
 @keyYear=keyYear,@keyMonth=keyMonth,@keyDay=keyDay,@keyNumLen=keyNumLen
 from sr_setidkey
 where setid=@TableName and keyType = '1'

----流水号的前缀即@keyTag
----根据Sr_SetIdKey表中的值,返回日期的格式化形式 如20070509
 declare @DateString varchar(8)    ----当前日期
 declare @year varchar(4)
 declare @month varchar(2)
 declare @day varchar(2)

    set @year=convert(varchar(4),year(getdate()))
 set @month=convert(varchar(4),month(getdate()))
 set @day=convert(varchar(4),day(getdate()))
   
 if(@keyYear = 0)
  set @year= '';
 if(@keyYear = 2)
  set @year= subString(@year,3,4)
 if(@keyMonth = 0)
  set @month= '';
 if(@keyMonth = 2 and len(@month)=1)
  set @month=N'0'+@month
 if(@keyDay = 0)
  set @day= '';
 if(@keyDay = 2 and len(@day)=1)
  set @day=N'0'+@day
    SET @DateString = @year+@month+@day

--返回后缀的递增号,按查询出的长度生成,不足补0
 --流水号生成,返回当日最大流水号,否则,一律从001号开始生成
    --存在一个当日同前缀的流水号的条件:
    --1.相同的流水号前缀,即status1前缀名称必须与Sr_SetIdKey表中对应的keyTag字段内容相同,不区分大小写
    --2.相同的当日的中间日期

    declare @LastSheetNo varchar(50) --记录中最后一条流水号
 declare @sql nvarchar(4000)
 set @sql = 'SELECT TOP 1 @a = status1 FROM '+@TableName
    +' WHERE LEFT(status1,len('''+@keyTag+''')) = '''+@keyTag
    +''' AND Right(LEFT(status1,len('''+@keyTag+@DateString+''')),len('''+@DateString+''')) = '''+@DateString
    +''' ORDER BY status1 DESC'

 exec sp_executesql @sql,N'@a varchar(50) output',@LastSheetNo output
 --查询出后缀的字符串,转换成INT格式方便递增
    --定义好相关参数,比较是否有相同的流水号前缀
    --存在,获取最后一条流水+1
 declare @suffixStr int
 declare @SuffixResult varchar(50)

 if (@LastSheetNo is null or @LastSheetNo = '')
  set @suffixStr = 1
 else
  set @suffixStr = convert(int,substring(@LastSheetNo,len(@keyTag) + @keyYear + @keyMonth + @keyDay+1,@keyNumLen)) + 1
 --补全0
 declare @i int
 set @i=0
 declare @temp varchar(50)
 set @temp = ''
 while @i<(@keyNumLen-1)
  BEGIN
   SET @temp=@temp+'0'
   SET @i=@i+1
  END
 set @SuffixResult = @temp +  convert(varchar(50),@suffixStr)
 --declare @Result varchar(50)
 set @Result = @keyTag + @DateString + @SuffixResult
 --select @Result
END

 

 

        public static string ConnectionString = AnyConfig.DataAccess_MainDataString;
        public static SqlConnection conn;

 

        #region 连接字符串自定义属性
        /// <summary>
        /// 连接字符串自定义属性
        /// </summary>
        public string ConnStr
        {
            get
            {
                return ConnectionString;
            }
            set
            {
                ConnectionString = value;
            }
        }
        #endregion 测试链接

        #region 测试链接
        /// <summary>
        /// 测试链接
        /// </summary>
        /// <returns></returns>
        public bool testConn()
        {
            if (open())
            {
                this.closeConn();
                return true;
            }
            else
            {
                this.closeConn();
                return false;
            }
        }
        #endregion

 

 

        #region getSerialNumber执行带一个输出参数的存储过程
        /// <summary>
        /// 执行带一个输出参数的存储过程
        /// </summary>
        /// <param name="sql">存储过程的名称</param>
        /// <param name="paramenters">参数,存储过程中的参数
        /// SqlParameter[] Parament=new SqlParameter[2];
        ///Parament[0]=new SqlParameter("@sqlstr",SqlDbType.NVarChar,4000);
        ///Parament[0].Value=sql;
        ///Parament[1]=new SqlParameter("@currentpage",SqlDbType.Int,4);
        ///Parament[1].Value=curpage;</param>
        /// <returns>返回存储过程的输出参数</returns>
        public string getSerialNumber(string sql, params SqlParameter[] paramenters)
        {
            string result = "";
            if (open())
            {
                try
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = conn;
                    cmd.CommandText = sql;
                    if (paramenters != null)
                    {
                        foreach (SqlParameter parm in paramenters)
                            cmd.Parameters.Add(parm);
                    }
                    cmd.Parameters.Add("@Result", SqlDbType.VarChar, 50);
                    cmd.Parameters["@Result"].Direction = ParameterDirection.Output;
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.ExecuteNonQuery();

                    result = cmd.Parameters["@Result"].Value.ToString();
                }
                catch (Exception ex)
                {
                    SysDataLog.log(ex);
                    string str = ex.ToString();
                }
                finally
                {
                    closeConn();
                }
            }
            return result;
        }
        #endregion
    }

 

        #region 打开数据库连接
        /*
         *打开数据库连接
         */
        private bool open()
        {
            bool bl = true;
            try
            {
                conn = new SqlConnection(ConnectionString);
                conn.Open();
            }
            catch (Exception ex)
            {
                SysDataLog.log(ex);
                bl = false;
            }
            return bl;

        }
        #endregion

        #region 关闭数据库连接
        /// <summary>
        /// 关闭数据库连接
        /// </summary>
        /// <returns></returns>
        private bool closeConn()
        {
            try
            {
                if (conn.State.ToString() == "Open")
                    conn.Close();
                conn.Dispose();
                return true;//关闭成功,返回true
            }
            catch (Exception ex)
            {
                SysDataLog.log(ex);
                return false;//关闭失败,返回false   
            }
        }
        #endregion

 

        DataAccessBase dab = new DataAccessBase();

        string strTable = "a010";
        SqlParameter[] Parament = new SqlParameter[1];
        Parament[0] = new SqlParameter("@tableName", SqlDbType.VarChar, 50);
        Parament[0].Value = strTable;

        lblNo.Text = dab.getSerialNumber("GetSerialNumber", Parament);

最后

以上就是端庄小鸭子为你收集整理的流水号生成存储过程的全部内容,希望文章能够帮你解决流水号生成存储过程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部