SQL列数据转换为标准格式2008r2

时间:2014-08-07 16:14:40

标签: sql sql-server-2012

我正在尝试将手动MS Access进程迁移到自动SQL进程

除最后一栏外,我的每项工作都按预期进行。

以下是示例表数据,然后在下面是我尝试将数据更改为。

10903  
1091    
319     
2968A   
782R 

需要看起来像这样

10903
01091
00391
02968
00782

第一列中的任何字符串都需要被拆分为数字,如果字符串小于5则在前面添加零。

我理解如何在Access中进行对话,如果能够访问SQL Server 2012或更高版本,那就没关系。

思想?

我是否需要使用SET和一长串嵌套的IF?

2 个答案:

答案 0 :(得分:1)

借用the answer from here,并假设你总是想要一个五位数输出,你会看到这样的东西:

DECLARE @textval NVARCHAR(30)
SET @textval = '2968A'

SELECT RIGHT('00000' + CAST(LEFT(SUBSTRING(@textval, PATINDEX('%[0-9.-]%', @textval), 8000),
           PATINDEX('%[^0-9.-]%', SUBSTRING(@textval, PATINDEX('%[0-9.-]%', @textval), 8000) + 'X') -1) AS VARCHAR(5)), 5)

但是,如果您的号码超过五位数,则需要对其进行修改以将其考虑在内。无论如何,将两个“8000”值替换为varchar列的长度。

要针对您的表运行此操作,请将所有出现的@textval替换为您的列名(并添加FROM / WHERE /任何其他子句)。

答案 1 :(得分:0)

here获得答案并填写结果。因为你已经有了字符,所以不需要转换为varchar。

create table YourTable
(
  Data varchar(100)
);

insert into YourTable values
('10903'),
('1091'    ),
('319'  ),
('2968A'),
('782R')

Select Right('00000'+ isnull(Left(
             SubString(Data, PatIndex('%[0-9.-]%', Data), 8000), 
             PatIndex('%[^0-9.-]%', SubString(Data, PatIndex('%[0-9.-]%', Data), 100) + 'X')-1),
        ''),5)

from YourTable

http://sqlfiddle.com/#!3/bd3c3/5