在SQL中生成具有固定长度的字符串前缀的列表

时间:2017-03-12 17:04:36

标签: sql sql-server list

我只想生成一个像这样的列表

XY0001  
XY0002  
XY0003  

所有行的前缀都相同。需要固定长度(本例中为6)
寻找一种简单的方法来生成这样的列表,将其放入临时表中。

MS SQL

这个数字非常小:

DECLARE @TempList TABLE (Name VARCHAR(100));  
insert into @TempList Values ('XY00001')   
insert into @TempList Values ('XY00002')   
insert into @TempList Values ('XY00003')   
insert into @TempList Values ('XY00004')   


select * from @TempList  

2 个答案:

答案 0 :(得分:0)

您可以使用ad-hoc计数表

如果2012 +

DECLARE @TempList TABLE (Name VARCHAR(100)); 

Select Name = 'XY'+format(N,'0000')
 From (Select Top 9999 N=Row_Number() Over (Order By (Select NULL)) From master..spt_values N1,master..spt_values N2) A
 Order by N

<强>返回

Name
XY0001
XY0002
XY0003
XY0004
...
XY9997
XY9998
XY9999

如果不是

DECLARE @TempList TABLE (Name VARCHAR(100));

Select Name = 'XY'+right('00000'+cast(N as varchar(25)),4)
 From (Select Top 9999 N=Row_Number() Over (Order By (Select NULL)) From master..spt_values N1,master..spt_values N2) A
 Order by N

答案 1 :(得分:0)

我喜欢使用递归CTE。

declare @max_number int = 1000;

with num as (
  select 1 as n
  union
  select n + 1
  from num
  where n < @max_number
)
select 'XY' + (cast n as char(4))
from num;

递归CTE为您提供数字,而施法者使用0进行左侧填充以确保您获得0001而不是1。

这种方法将支持可变数量的输出。虽然正如你在问题中提到的那样,如果你只想要一些,那就太过分了。

(你需要对边界情况进行测试。我没有测试过这个确切的代码示例。)

由于它使用递归,因此缩放的程度可能有限。