【问题标题】:Error converting data type varchar to numeric and varchar to datetime将数据类型 varchar 转换为 numeric 和 varchar 转换为 datetime 时出错
【发布时间】:2015-08-14 17:30:35
【问题描述】:

将数据类型 varchar 转换为数值时出错

将 char 数据类型转换为 datetime 数据类型导致 datetime 值超出范围。

declare @rsnMain numeric, @rsnAcnt numeric, @rsnRel numeric;
set @rsnMain = (select max(record_serial_number)
                from sdg_aaismain)
set @rsnAcnt = (select max(record_serial_number)
                from sdg_aaisacnt)
set @rsnRel = (select max(record_serial_number)
                from sdg_aaisrel)

insert into sdg_aaismain
(RECORD_SERIAL_NUMBER,
 AGENT_NUMBER,
 AGENT_STATUS_CODE,
 AGENT_STATUS_DESP,
 TRADE_NAME,
 GROUP_TYPE_1,
 MADE_ON_BEHALF,
 MADE_ON_BEHALF_DESP,
 LICENSE_RENEWAL_CODE,
 LICENSE_RENEW_DESP,
 ACTUAL_NO_STREET,
 ACTUAL_TOWN,
 ACTUAL_STATE,
 ZIP_CODE_PREFIX,
 ZIP_CODE_SUFFIX,
 CITY_CODE,
 DISTRICT_CODE,
 COUNTY_CODE,
 MUNICIPALITY_CODE,
 ACTUAL_DISTRICT,
 ACTUAL_COUNTY,
 ACTUAL_MUNICIPALITY,
 CONTACT_LAST_NAME,
 CONTACT_FIRST_NAME,
 STORE_OPEN_HOURS#1,
 STORE_OPEN_HOURS#2,
 STORE_OPEN_HOURS#3,
 STORE_OPEN_HOURS#4,
 STORE_OPEN_HOURS#5,
 STORE_OPEN_HOURS#6,
 STORE_OPEN_HOURS#7,
 STORE_CLOSE_HOURS#1,
 STORE_CLOSE_HOURS#2,
 STORE_CLOSE_HOURS#3,
 STORE_CLOSE_HOURS#4,
 STORE_CLOSE_HOURS#5,
 STORE_CLOSE_HOURS#6,
 STORE_CLOSE_HOURS#7,
 MAILING_ADDRESS,
 MAILING_CITY,
 MAILING_STATE,
 MAILING_ZIP_CODE_PREFIX,
 MAILING_ZIP_CODE_SUFFIX,
 CREATE_DATE,
 MODIFY_DATE,
 MODIFY_TIME,
 USER_ID,
 AGENT_TYPE,
 NAIC_CODE,
 CONTRACT_TYPE,
 LONGITUDE,
 LATITUDE,
 CORP_NAME,
 DSR,
 FEDTAX_NAME,
 FEDTAX_ID,
 TIN_TYPE,
 NAME_CNTL,
 ES_GROUPTYPE,
 ADDRESS2,
 --CORPORATION_NUMBER)
INSTALL_DATE)

select 
 @rsnMain + ROW_NUMBER() over (order by agent_number),
 AGENT_NUMBER,
 AGENT_STATUS_CODE,
 AGENT_STATUS_DESC,
 TRADE_NAME, 
 cast(right(CHAIN_PARENT_RETAIL_NO,3) as numeric(3,0)) as GROUP_TYPE_1,
 MADE_ON_BEHALF,
 MOB_DESC,
 LICENSE_RENEWAL_CODE,
 RENEWAL_STATUS_DESC,
 ACTUAL_NO_STREET,
 ACTUAL_TOWN, ACTUAL_STATE,
 cast(ZIP_PREFIX as numeric (5,0)) as ZIP_PREFIX,
 cast(ZIP_SUFFIX as numeric (4,0)) as ZIP_SUFFIX,
 CITY_CODE,
 cast(DISTRICT_CODE as numeric (3,0)) as DISTRICT_CODE,
 cast(COUNTY_CODE as numeric(3,0)) as COUNTY_CODE,
 MUNICIPALITY_CODE,
 ACTUAL_DISTRICT,
 ACTUAL_COUNTY,
 ACTUAL_MUNICIPALITY,
 CONTACT_LAST_NAME,
 CONTACT_FIRST_NAME,
 STORE_OPEN_HOURS#1,
 STORE_OPEN_HOURS#2,
 STORE_OPEN_HOURS#3,
 STORE_OPEN_HOURS#4,
 STORE_OPEN_HOURS#5,
 STORE_OPEN_HOURS#6,
 STORE_OPEN_HOURS#7,
 STORE_CLOSE_HOURS#1,
 STORE_CLOSE_HOURS#2,
 STORE_CLOSE_HOURS#3,
 STORE_CLOSE_HOURS#4,
 STORE_CLOSE_HOURS#5,
 STORE_CLOSE_HOURS#6,
 STORE_CLOSE_HOURS#7,
 MAILING_ADDRESS,
 MAILING_CITY,
 MAILING_STATE,
 cast(MAIL_ZIP_PREFIX as numeric (5,0)) as MAIL_ZIP_PREFIX,
 cast(MAIL_ZIP_SUFFIX as numeric (4,0)) as MAIL_ZIP_SUFFIX,
 convert(datetime, CREATE_DATE) as CREATE_DATE,
 convert(datetime, GetDate()) as MODIFY_DATE,
 replace(Convert (varchar(8), GetDate(), 108),':','') as MODIFY_TIME,
 'DAILY UPDATE',
 AGENT_TYPE,
 NAIC_CODE,
 cast(CONTRACT_TYPE as numeric (1,0)) as CONTRACT_TYPE,
 LONGITUDE,
 LATITUDE,
 CORP_NAME,
 DSR,
 FEDTAX_NAME,
 FEDTAX_ID,
 TIN_TYPE,
 NAME_CONTROL,
 cast(ES_GROUPTYPE as numeric (6,0)) as ES_GROUPTYPE,
 ADDRESS2,
 --cast(CORPORATION_NUMBER as numeric (11,0)),
 convert(datetime, INSTALL_date)
from sdg_tmp_aaismain as tmp
where NOT EXISTS(select NULL
                 from sdg_aaismain as dest
                 where tmp.agent_number = dest.agent_number 
                 ) 

上面的代码是一个较长的更新语句的示例。我有 2 列给我“将数据类型 varchar 转换为数字时出错”错误。这是因为有些记录有字符数据。

4 个不同的 varchar 列发生了超出范围的错误,这些列的日期都将“00000000”作为某些行的值。

如何从我的选择查询中排除字符数据和零?

谢谢, 斯科特

【问题讨论】:

  • 我遇到问题的列之一是 CORPORATION_NUMBER。我尝试将以下代码添加到我的 select 语句并收到此错误:子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。 (选择 cast(tmp.CORPORATION_NUMBER as numeric (11,0)) as CORPORATION_NUMBER from sdg_tmp_aaismain tmp where tmp.CORPORATION_NUMBER not in ('','0','00000000000') and tmp.CORPORATION_NUMBER not like '%[a-z,A-Z ,/,\,-,.]%')

标签: sql-server-2005


【解决方案1】:

如果你想完全排除该行,那么你可以这样做:

WHERE ISDATE(someColumn)=1

如果您想包含该行,但在日期中添加一个空值,您可以这样做:

INSERT INTO someTable (datecolumn)
SELECT CASE WHEN ISDATE(someColumn)=1 THEN CONVERT(DATETIME,someColumn) ELSE NULL END
FROM someOtherTable

【讨论】:

  • 我在我的选择语句的末尾尝试了这个 CORPORATION _NUMBER 使用以下内容:(当 CORPORATION_NUMBER 不在('','0','00000000000','nul')时选择案例然后转换(数字,corporate_number)else null end from sdg_tmp_aaismain).....所有这些列都允许NULL。我不知道为什么他们中的一些人有字符串'nul'。我仍然收到将 varchar 转换为数字的错误。
  • 如果你在做数字,你可以用isnumeric(somecolumn)=1代替isdate(somecolumn)=1,而不是硬编码一个列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 2020-12-06
  • 2021-04-26
  • 2019-08-26
  • 1970-01-01
相关资源
最近更新 更多