将sql中的数据从int大量更新到varchar

时间:2010-03-19 19:04:15

标签: sql formatting sql-server-2000

我们有一个大表(5608782行并且正在增长)有3列Zip1,Zip2,距离

所有列目前都是int,我们希望将此表转换为使用varchars进行国际使用,但需要对新表进行大量导入转换zip< 5位到0填充的varchars 123变成00123等。有没有办法在每一行上循环并以编程方式进行翻译?

5 个答案:

答案 0 :(得分:4)

一个简单的RIGHT将在SQL Server中执行

INSERT
    newTable (...
SELECT
    RIGHT('00000' + CAST(Zip AS varchar(5)), 5),
    ...
FROM
    OldTable

答案 1 :(得分:2)

以下示例假设您正在使用MS SQL Server。有关复制功能的帮助,请参阅here

insert  NewZipTable
        (Zip1,
        Zip2,
        Distance)
select  replicate('0', 5 - len(Zip1)) + CAST(Zip1 as VARCHAR(10)),
        replicate('0', 5 - len(Zip2)) + CAST(Zip2 as VARCHAR(10)),
        Distance
from    OldZipTable

答案 2 :(得分:0)

用于SQL Server ....

试试这个,假设新列的nvarchar(20):

INSERT INTO NewTable
       (col1, col2, col3
       ,NewZip)
    SELECT
        col1, col2, col3
        ,RIGHT(REPLICATE(N'0',20)+CONVERT(nvarchar(20),oldZip),20) --null will result in null
        FROM OldTable

答案 3 :(得分:0)

不要在循环中执行这些操作,通常可以使用具有更好性能的纯SQL来完成它们。

此外,始终将代码和其他不能用于计算的内容存储为字符。从来没有听说过10%的邮政编码增加:)


使用Oracle的示例:

Insert Into new_table (zip1, zip2, distance)
    Select
        TO_CHAR( zip1, 'FM00000' ),
        TO_CHAR( zip2, 'FM00000' ),
        distance
    From old_table

答案 4 :(得分:0)

在MySQL中你可以这样做:

INSERT INTO newTable (zip1, zip2, distance) 
SELECT LPAD(zip1, 5, '0'), LPAD(zip2, 5, '0'), distance
FROM oldTable;