zoukankan      html  css  js  c++  java
  • SQLServer流水号自动生成

      最近给客户做生成条码的功能时,碰到个问题,需要根据数量自动生成流水号,然后加上客户指定的前缀,组合成条码。

      折腾了一会,最后通过个存储过程实现。  

      --@Prefix 指定前缀,@InitialVal 流水号起始值,@IncrementVal 流水号递增值,@TotalNum 流水号总数,@BitNum 流水号位数
      

      IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id=object_id(N'[dbo].[SP_GenerateSerialNo]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
      DROP PROCEDURE [dbo].SP_GenerateSerialNo
      GO

      SET QUOTED_IDENTIFIER ON
      GO
      SET ANSI_NULLS ON
      GO

      CREATE PROCEDURE SP_GenerateSerialNo @Prefix nvarchar(50), @InitialVal int, @IncrementVal int, @TotalNum int, @BitNum int
      AS
      DECLARE @SQL nvarchar(1000)
      IF EXISTS(SELECT * FROM tempdb..sysobjects WHERE id=object_id('tempdb..##t'))
      DROP TABLE ##t
      SET @SQL=N'SELECT TOP '+CONVERT(nvarchar(10),@TotalNum)+' id=IDENTITY(INT,'+CONVERT(nvarchar(4),@InitialVal)+','+CONVERT(nvarchar(4),@IncrementVal)+') INTO ##t FROM sysobjects,syscolumns'
      --print @SQL
      EXEC sp_executesql @SQL
      SELECT LTRIM(RTRIM(@Prefix))+SUBSTRING(ret, LEN(ret)-@BitNum+1, @BitNum) as SerialNo FROM (
        SELECT '00000000000000000000'+CONVERT(nvarchar(10), id) as ret FROM ##t) a
      --SELECT * FROM ##t
      DROP TABLE ##t
      GO
      SET QUOTED_IDENTIFIER OFF
      GO
      SET ANSI_NULLS ON
      GO

      中间碰到个问题,就是组合成的SQL语句,通过EXEC sp_executesql @SQL 执行时,如果语句中是本地临时表(#)就会报错,如下图,改成全局临时表(##)可解决。

      

      测试:exec SP_GenerateSerialNo 'test', 10,3,1000,6

      结果:

        ~  

  • 相关阅读:
    百战天虫中子弹的挖坑效果
    as3对象销毁是否需要全部属性置null?
    事件冒泡其实就是它给它的parent send一个事件
    25个Photoshop创作的励志展示
    15个免费的关于杂志的wordpress主题
    wordpress主题:New Horizon 博客/创意展示主题[v1.0.3][荐](类似瀑布流)
    linux nl命令与逻辑页
    PLSQL用DBMS_JOB建立作业
    PLSQL DBMS_DDL.ANALYZE_OBJECT
    PLSQL的UTL_FILE使用例子
  • 原文地址:https://www.cnblogs.com/mozzie/p/4939607.html
Copyright © 2011-2022 走看看