Sql server 在SQL SERVER 2012中将zipcode更新为带零的Pad

Sql server 在SQL SERVER 2012中将zipcode更新为带零的Pad,sql-server,Sql Server,我有一个带有Zipcode列的表。 Zipcode列是一个int。 如何更新此列以显示填充的零,以便所有值都是5位数字? 我知道如何作为SELECT语句执行此操作,但不知道如何更新表中的coulmn。下面是我最大的努力 USE RTCA_new GO UPDATE tbl_BASE SET Zipcode = ( SELECT FORMAT(Zipcode, '00000') FROM rtca.tbl_BASE ) 由此产生的错误是: 子查询返回了多个值。当子

我有一个带有Zipcode列的表。 Zipcode列是一个int。 如何更新此列以显示填充的零,以便所有值都是5位数字? 我知道如何作为SELECT语句执行此操作,但不知道如何更新表中的coulmn。下面是我最大的努力

USE RTCA_new
GO

UPDATE tbl_BASE
SET Zipcode = (
SELECT FORMAT(Zipcode, '00000')
FROM rtca.tbl_BASE
               )
由此产生的错误是:

子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。 声明已终止

简言之,我希望zipcode值802显示为00802,它的工作原理不同:

Update tbl_BASE set zipcode = right('000000' + zipcode, 6) 
它的工作原理不同:

Update tbl_BASE set zipcode = right('000000' + zipcode, 6) 

您可能已经知道,邮政编码可以以0开头。sql server中的整数不允许0填充

我认为你的选择是:

总是在选择中填充它 将列类型更改为更合适的varchar,并填充0到5个字符。你最好这样做 新列的步骤:

例如,为zipCode newZipCode创建新的varchar5列 将newZipCode列填充为:

更新tbl_库 将newZipCode=right'00000'+castzipCode设置为varchar5,5

删除int-zipcode列

将newZipCode列重命名为zipCode 错误的具体原因:

子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。声明已终止

在查询中:

UPDATE tbl_BASE
SET Zipcode = (
SELECT FORMAT(Zipcode, '00000')
FROM rtca.tbl_BASE
               )
是因为您的语句中存在逻辑错误或类似错误。您正在尝试将标量值ZipCode设置为您选择的格式的集合值。。。声明

声明:

SELECT FORMAT(Zipcode, '00000')
FROM rtca.tbl_BASE
它本身会为表中的每一行返回一行,但不能将整个结果集设置为标量值。即时错误可以通过以下方式修复:

UPDATE tbl_BASE
SET Zipcode = FORMAT(Zipcode, '00000')

这将为zipcode返回一个值。。。尽管同样是由于您当前的表架构,这不会给您希望的结果,因为整数不能用0填充,正如您可能已经发现的,邮政编码可以从0开始。sql server中的整数不允许0填充

我认为你的选择是:

总是在选择中填充它 将列类型更改为更合适的varchar,并填充0到5个字符。你最好这样做 新列的步骤:

例如,为zipCode newZipCode创建新的varchar5列 将newZipCode列填充为:

更新tbl_库 将newZipCode=right'00000'+castzipCode设置为varchar5,5

删除int-zipcode列

将newZipCode列重命名为zipCode 错误的具体原因:

子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。声明已终止

在查询中:

UPDATE tbl_BASE
SET Zipcode = (
SELECT FORMAT(Zipcode, '00000')
FROM rtca.tbl_BASE
               )
是因为您的语句中存在逻辑错误或类似错误。您正在尝试将标量值ZipCode设置为您选择的格式的集合值。。。声明

声明:

SELECT FORMAT(Zipcode, '00000')
FROM rtca.tbl_BASE
它本身会为表中的每一行返回一行,但不能将整个结果集设置为标量值。即时错误可以通过以下方式修复:

UPDATE tbl_BASE
SET Zipcode = FORMAT(Zipcode, '00000')

这将为zipcode返回一个值。。。尽管同样是由于当前的表架构,但这不会给出您希望的结果,因为整数不能用0填充

您需要将Zipcode列的数据类型更改为varchar。完成此操作后,您可以使用replicate、concat和right函数格式化数据:

UPDATE tbl_BASE
SET zipcode = right(CONCAT(
            replicate('0', 5)
            ,cast(zipcode as varchar(5))
            ), 5)

您需要将Zipcode列的数据类型更改为varchar。完成此操作后,您可以使用replicate、concat和right函数格式化数据:

UPDATE tbl_BASE
SET zipcode = right(CONCAT(
            replicate('0', 5)
            ,cast(zipcode as varchar(5))
            ), 5)

如果可能,最好更改数据库设计,即使不使用字符串值可能会在行中节省一点点存储空间。如果您只需要将其转换为显示目的,那么这只是一个转换问题

select right('00000' + cast(zipcode as varchar(5)), 5) from T...
-- for use format() on later editions of SQL Server
顺便说一句,我仍然建议您阅读一些有关更新的内容,以了解为什么您并不真正需要一个子查询来完成您试图完成的任务


如果需要动态进行此转换,可以向表中添加计算列。看到您试图用格式化值更新列,可能就证明了最大的问题确实是对数据类型的误解,正如已经指出的那样。

如果可能,最好更改数据库设计,即使不使用字符串值可能会在行中节省一点存储空间。如果您只需要将其转换为显示目的,那么这只是一个转换问题

select right('00000' + cast(zipcode as varchar(5)), 5) from T...
-- for use format() on later editions of SQL Server
顺便说一句,我仍然建议您阅读一些有关更新的内容,以了解为什么您并不真正需要一个子查询来完成您试图完成的任务

如果需要此转换,可以向表中添加计算列
在飞行中发生。看到您试图用格式化的值更新列,可能就证明了最大的问题确实是对数据类型的误解,正如已经指出的那样。

为什么要用0填充来存储它?为什么不在返回存储过程、视图甚至应用程序代码中的数据时处理此问题?我尝试过这样做,但每当我将其加载到SQL SERVER时,数据都会恢复为隐藏填充的零:/n不可能执行您想要的操作。你的问题源于对整数是什么的一个根本性误解。听起来你真的不想在这个列中使用INT。把它作为整数有什么好处?你不会对这些数据做标准的数学运算。。。i、 e.4个用户的邮政编码之和是多少?此列实际上是字符串数据类型而不是数字数据类型,因此将其存储为VARCHAR,填充问题就会消失。修复列类型后,使用Luc提供的答案更新数据。为什么要用0填充来存储它?为什么不在返回存储过程、视图甚至应用程序代码中的数据时处理此问题?我尝试过这样做,但每当我将其加载到SQL SERVER时,数据都会恢复为隐藏填充的零:/n不可能执行您想要的操作。你的问题源于对整数是什么的一个根本性误解。听起来你真的不想在这个列中使用INT。把它作为整数有什么好处?你不会对这些数据做标准的数学运算。。。i、 e.4个用户的邮政编码之和是多少?此列实际上是字符串数据类型而不是数字数据类型,因此将其存储为VARCHAR,填充问题就会消失。修复列类型后,使用Luc提供的答案更新数据。如果我将列转换为varchar,您将如何更新要填充的varchar列?@JasonMatney我不确定我是否理解您的问题。。。我的更新有帮助吗?是的,非常有帮助。真的很感激!如果我将varchar列转换为varchar,您将如何更新要填充的varchar列?@JasonMatney我不确定我是否理解您的问题。。。我的更新有帮助吗?是的,非常有帮助。真的很感激!