当前位置: 代码迷 >> Sql Server >> 已知起初号和截止号 自动生成 列
  详细解决方案

已知起初号和截止号 自动生成 列

热度:370   发布时间:2016-04-24 08:56:53.0
已知起始号和截止号 自动生成 列
数据库:Sql2008R2
要求 生成一组数列  已知 开始号码为 A0100001 和截止号码 A0101000

自动生成  A0100001 
                  A0100002 
                  A0100003 
                       .....
                  A0100999
                  A0101000 

第二种方法:已知开始号码为 A0100001  告知要生成1000个号码
 自动生成  A0100001 
                  A0100002 
                  A0100003 
                       .....
                  A0100999
                  A0101000 

求sql语句

  declare @qs varchar(20)='A0100001',@jz Varchar(20)='A0101000'
  

 
------解决思路----------------------
如果涉及到序列,这个序列一定是整数类型的。不然不好控制啊。最终的规则code可以后续拼凑在一起的。
如:

  DECLARE @StarIndex INT=100001 ,@EndIndex INT=101000
  
  WHILE @StarIndex <=@EndIndex
   BEGIN
    SELECT 'A0'+LTRIM(@StarIndex) 
    SELECT @StarIndex+=1
   END

------解决思路----------------------

试试这个:
declare @qs varchar(20)='A0100001',@jz Varchar(20)='A0101000'
  

select left(@qs,1)+cast((cast(right(@qs,len(@qs)-1) as numeric)+s.number) as varchar)
from master..spt_values s
where s.number >=0
and s.type = 'P'
and s.number <= cast(right(@jz,len(@jz)-1) as numeric)-cast(right(@qs,len(@qs)-1) as numeric)

------解决思路----------------------
DECLARE @start int
DECLARE @finish int
SET @start = 10000001 
SET @finish = 10001000

DECLARE @diff int 
-- 如果已知起止,先求出差值
-- 如果已知开始和个数,差值=个数-1
SET @diff = @finish - @start

SELECT @start + number code
  FROM master..spt_values
 WHERE type = 'p'
   AND number <= @diff

       code
-----------
   10000001
   10000002
   10000003
...
   10000998
   10000999
   10001000

------解决思路----------------------
突然发现是我没有仔细看Tiger_Zhao的回答,我错了
------解决思路----------------------


;WITH a AS (
SELECT number FROM master..spt_values
),b AS (
SELECT rn=ROW_NUMBER() OVER(ORDER BY GETDATE()) FROM a x CROSS JOIN a y
)
SELECT 'A01'+RIGHT('00000000'+CAST(rn AS VARCHAR(10)),5) FROM b WHERE rn BETWEEN 1 AND 1000 --想要好多改好多

------解决思路----------------------

 --第一种方法:要求 生成一组数列  已知 开始号码为 A0100001 和截止号码 A0101000
 --1、求出要生成多少个号码
 DECLARE @I INT
 SELECT @I=CAST(SUBSTRING('A0101000',2,10) AS INT)- CAST(SUBSTRING('A0100001',2,10) AS INT)+1
 --2、生成数列
 SELECT 'A0'+CAST((100000+NUMBER) AS VARCHAR(10)) FROM master..spt_values WHERE [TYPE]='P' AND NUMBER BETWEEN 1 AND @I

 --第二种方法:已知开始号码为 A0100001  告知要生成1000个号码
 SELECT 'A0'+CAST((100000+NUMBER) AS VARCHAR(10)) FROM master..spt_values WHERE [TYPE]='P' AND NUMBER BETWEEN 1 AND 1000
 
 -- master..spt_values 这个表里的数字只能到2047,如需要更多数列,请自己写一个数字字典表。
  相关解决方案