【问题标题】:select fails when converting data type varchar to numeric将数据类型 varchar 转换为数字时选择失败
【发布时间】:2015-02-19 02:58:02
【问题描述】:

我的选择是从table 1 插入到table 2,当我运行它时,我收到以下消息:

消息 8114,第 16 级,状态 5,第 5 行
将数据类型 varchar 转换为数值时出错。

我从 varchar 转换为 numeric 的列是:

  • 标题
  • 坎比奥
  • 液体
  • 结果

如果我从选择中删除这些列,它工作正常。

这是实际的选择:

INSERT INTO SICAVS1_Transacciones_con_ISIN 
(tipo_operacion, fecha, cod_operacion,
 nombre, titulos, cambio, liquido,
 resultado, ISIN )
SELECT DISTINCT st.tipo_operacion
              , st.fecha
              , st.cod_operacion
              , st.nombre
              , cast(st.titulos as DECIMAL(16,2))
              , cast(st.cambio as DECIMAL(16,2))
              , cast(st.liquido as DECIMAL(16,2))
              , cast(st.resultado as DECIMAL(16,2))
              , st.ISIN 
FROM temp_Transacciones st WHERE NOT EXISTS
(SELECT 1 
  FROM SICAVS1_Transacciones t2
  WHERE t2.tipo_operacion = st.tipo_operacion 
    AND t2.fecha = st.fecha
    AND t2.cod_operacion = st.cod_operacion
    AND t2.nombre = st.nombre
    AND t2.ISIN = st.ISIN)

这是 SICAVS1_transacciones_con_ISIN[dbo].[SICAVS1_Transacciones_con_ISIN] 的表格方案

[ID] [int] IDENTITY(1,1) NOT NULL,
[tipo_operacion] [varchar](30) NULL,
[fecha] [varchar](10) NULL,
[cod_operacion] [varchar](6) NULL,
[nombre] [varchar](32) NULL,
[titulos] [decimal](16, 2) NULL,
[cambio] [decimal](16, 2) NULL,
[liquido] [decimal](16, 2) NULL,
[resultado] [decimal](16, 2) NULL,
[ISIN] [varchar](20) NULL,
[fecha_valor] [date] NULL,
[type] [varchar](14) NULL,
[categoria_1] [char](35) NULL,
CONSTRAINT [PK__BNP_SICA__3214EC27DA21ECEF] PRIMARY KEY CLUSTERED 
(
  [ID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

【问题讨论】:

  • 您能显示SICAVS1_Transacciones_con_ISIN 的表架构吗?您要转换为 DECIMAL 的列之一似乎不是合适的类型。
  • 你的列必须包含你试图转换成十进制(16,2)的字母......因此它会抛出这个错误......
  • 你好 Dhaval,这是 SICAVS1_transacciones_con_ISIN 的表格方案

标签: sql sql-server


【解决方案1】:

SQL Server 2012 及更高版本

只需改用 Try_Convert:

TRY_CONVERT 获取传递给它的值并尝试 将其转换为指定的 data_type。如果施法成功, TRY_CONVERT 将值作为指定的 data_type 返回; 如果发生错误,则返回 null。 但是,如果您请求的转换明确没有 允许,然后 TRY_CONVERT 失败并出现错误。

Read more about Try_Convert.

【讨论】:

  • 确实是一个非常有用的功能。非常感谢。但是现在我得到了很多 NULLS 而不是我应该得到的实际数字。所以问题还没有解决。
【解决方案2】:

其中一行不是数字,您必须消除它们。要找到它们:

SELECT DISTINCT st.tipo_operacion
              , st.fecha
              , st.cod_operacion
              , st.nombre
              , st.titulos
              , st.cambio
              , st.liquido
              , st.resultado
              , st.ISIN 
FROM temp_Transacciones st WHERE NOT EXISTS
(SELECT 1 
  FROM SICAVS1_Transacciones t2
  WHERE t2.tipo_operacion = st.tipo_operacion 
    AND t2.fecha = st.fecha
    AND t2.cod_operacion = st.cod_operacion
    AND t2.nombre = st.nombre
    AND t2.ISIN = st.ISIN)
WHERE ISNUMERIC(st.titulos) = 0
    OR ISNUMERIC(st.cambio) = 0
    OR ISNUMERIC(st.liquido) = 0
    OR ISNUMERIC(st.resultado) = 0

请注意,这只会找到它们。它不会帮助您自行解决问题。无法将abc123 转换为数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 2011-12-01
    • 2016-09-21
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多