如何将前导0添加到char?

时间:2017-05-23 20:18:25

标签: sql sql-server reporting-services sql-server-2008-r2

我正在为客户编写导出,他们要求每列长度恰好为10个字符。在exoprt我有一个格式为char(10)的列,它是我们的发票号,但只有6个字符,所以我需要添加3个前导0。这就是我的尝试:

SELECT '000'+invno, invdte, '000'+item, brnkcomp, tqtyshp,price, bextpri, descrip
FROM artran a
LEFT JOIN arcust b ON a.custno = b.custno
WHERE invdte BETWEEN DATEADD("d",-7,GETDATE()) and GETDATE() AND item IN ('10120','1000290','30234','10491','10747','21449')

但对此的反应总是在0和发票号码之间留有空格。我没有空间。

000   6325290
000   6325301
000   6325331
000   6325357
000   6325369
000   6325400

我也试过这个,结果是在0和发票#

之间有一个空格
SELECT LEFT('000'+CAST(invno AS VARCHAR(15)),15) 
FROM artran a
LEFT JOIN arcust b ON a.custno = b.custno
WHERE invdte BETWEEN DATEADD("d",-7,GETDATE()) and GETDATE() AND item IN ('10120','1000290','30234','10491','10747','21449')

000   6325290
000   6325301
000   6325331
000   6325357
000   6325369
000   6325400

我希望输出看起来像这些结果:

0006325290
0006325301
0006325331
0006325357
0006325369
0006325400

我在SSRS中运行此导出,所以如果有方法可以更容易地执行此操作,我也可以这样做。谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用格式(列,'D10'),如下所示

 SELECT Format(invno, 'D10') as InvNo, invdte, '000'+item, brnkcomp, tqtyshp,price, bextpri, descrip
 FROM artran a
LEFT JOIN arcust b ON a.custno = b.custno
WHERE invdte BETWEEN DATEADD("d",-7,GETDATE()) and GETDATE() AND item IN 
  ('10120','1000290','30234','10491','10747','21449')

其他方式是做正确和演员:

SELECT RIGHT('0000000000'+CAST(InvNo AS VARCHAR(10)),10)...

答案 1 :(得分:0)

FORMAT功能仅在SQL Server 2012和转发版中可用。因此,在SQL Server 2008 R2中这对您不起作用。

我认为您尝试过的问题是invno中有前导空格。使用LTRIM删除它们,可以使用RTRIM删除任何尾随空格。然后用零填充你的值,只需将它们连接到左侧,然后取出你想要的最右边的字符数。在您的情况下,10。如果您完全确定您正在处理的值始终是设定的字符数,您只需添加所需的数字即可。但是,我在此处显示的方法将考虑原始值的不同长度。

SELECT RIGHT('0000000000' + LTRIM(RTRIM(invno)), 10) as InvNo, invdte, '000'+item, brnkcomp, tqtyshp,price, bextpri, descrip
FROM artran a
LEFT JOIN arcust b ON a.custno = b.custno
WHERE invdte BETWEEN DATEADD("d",-7,GETDATE()) and GETDATE() AND item IN 
  ('10120','1000290','30234','10491','10747','21449')

诺尔