Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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_List - Fatal编程技术网

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

在SQL中生成具有固定长度字符串前缀的列表,sql,sql-server,list,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')

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

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  

您可以使用临时理货表

如果2012年+

返回

如果不是


我喜欢用递归的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

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

您需要对边界情况进行测试。我还没有测试这个精确的代码示例


因为它使用递归,所以扩展的范围可能有限制。

请标记您正在使用的dbms,并澄清您所说的列表的含义。这一个对我来说非常好,我可以根据我的情况使用我的知识进行调整。不幸的是,它不工作语法错误-第一种方法立即起作用,而且非常短,在我看来这很好。唯一的缺点是,我不明白-@Volker只要运行子查询,就会看到它只生成一个数字列表。理货/数字表也可以做到这一点-很高兴它有帮助
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
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;