我正在为客户编写导出,他们要求每列长度恰好为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中运行此导出,所以如果有方法可以更容易地执行此操作,我也可以这样做。谢谢!
答案 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')
诺尔