Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用sql按照模式生成数字?_Sql_Sql Server - Fatal编程技术网

如何使用sql按照模式生成数字?

如何使用sql按照模式生成数字?,sql,sql-server,Sql,Sql Server,我想在SQL Server中生成一个模式 e、 g.PA0001 并每次递增(意味着如果已经生成PA0001,则下一个应该是PA0002,依此类推) 我不知道该怎么办 有人能帮忙吗?规范的方法是创建一个标识列,然后将此代码创建为计算列: create table . . . ( inc int not null identity(1, 1), . . . code as ('PA' + right('0000' + cast(inc as varchar(255)), 4

我想在SQL Server中生成一个模式

e、 g.PA0001

并每次递增(意味着如果已经生成PA0001,则下一个应该是PA0002,依此类推)

我不知道该怎么办


有人能帮忙吗?

规范的方法是创建一个标识列,然后将此代码创建为计算列:

create table . . . (
    inc int not null identity(1, 1),
    . . .
    code as ('PA' + right('0000' + cast(inc as varchar(255)), 4)
这只适用于一个前缀——如果希望所有值都以0001开头。如果有多个前缀,则可以:

  • 使用触发器
  • 计算查询中的代码
  • 更改您的要求,以便您可以使用没有其他含义的代码
    • 您可以写为:

      create table Test
      (
          ID int identity not null primary key,
          pattern  varchar(100)
      )
      
      Go
      
      create function Nextpattern (@id int) 
      returns varchar(20) 
      as 
      begin 
      return 'PA' + 
       CONVERT(VARCHAR(10), GETDATE(), 110) + right('00' + convert(varchar(10), @id), 2) 
      end
      
      --Solution 1:
      Go
      
      alter table Test add Newpattern as dbo.Nextpattern(ID)
      
      Go
      
      insert into Test values (1)
      
      Go
      
      
      --solution2:
      -- not good as what if two processes attempt to 
      -- add a row to the table at the exact same time?
      create function dbo.fnNextpattern() 
      returns varchar(20) 
      as 
      begin 
          declare @lastval varchar(20) 
          set @lastval = (select max(pattern) from Test) 
          if @lastval is null set @lastval = 'PA' + 
             CONVERT(VARCHAR(10), GETDATE(), 110) + '01'
          declare @i int 
          set @i = right(@lastval,2) + 1 
          return 'PA' +
          CONVERT(VARCHAR(10), GETDATE(), 110)+ right('00' + convert(varchar(10),@i),2) 
      end
      go
      

      前缀总是
      'PA'
      ?事实上,这种模式要复杂一些!这是PA+“CURRENTDATE”+“01,所以每天他们的数字部分都会重置,向下投票原因:为什么你不问问你需要的真实模式?人们在浪费时间回答一个不相关的问题。这可以在函数中而不是在表中完成吗?