2012-03-26 16 views
9

estoy corriendo un bastante estándar¿Por qué no SQL Server dime qué columna está causando el error

INSERT INTO [table] (col1, col2, ...coln) 
select * from #temp 

y estoy consiguiendo el error siguiente:

Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value 'NULL' to data type int.

entiendo la error, pero desea saber por qué la columna que está causando el problema no está identificada por el mensaje de error. ¿Hay alguna manera fácil de encontrar qué columna contiene el nulo travieso o es solo una estratagema para hacerme ver como si fuera productivo en el trabajo mientras que realmente solo pasé 30 minutos mirando un enorme conjunto de resultados sin llegar a ningún lado?

Editar: Gracias por la ayuda chicos, pero nadie realmente respondió la pregunta. ¿Son todos los RDBMS arrojados mensajes de error similares o son más útiles? Su 2012 ... prueba y error sobre posiblemente miles de columnas ¡debería estar muerto!

+1

Es molesto, de acuerdo, pero no hay manera de encontrar esto, realmente, que no sea prueba y error. En cualquier columna que espere que sea numérica, intente usar 'ISNUMERIC (columnName)' y vea si obtiene algún valor inesperado de '0' –

+3

Cuando recibo un error como ese, sé que, como soy un programador, no lo hice Ganar el derecho a mejores mensajes de error, porque mis propios mensajes de error son igualmente crípticos :) – dasblinkenlight

+4

@randy irrelevante ...Lo simplifiqué para el ejemplo – woggles

Respuesta

4

Me gustaría ver cómo llenas la tabla temporal. Parece que obtiene un valor de 'nulo' no NULO. Si estos datos provienen de un archivo de Excel, este es un problema común. Por lo general Clease los datos en primer lugar mediante la actualización de esta manera:

Update #temp 
set field1 = NULL 
where field1 = 'NULL' 

Si usted quiere hacer todo en el mismo comando de actualización, a continuación,

Update #temp 
set field1 = NULLIF(field1, 'NULL') 
, field2 = NULLIF(field2, 'NULL') 
, field3 = NULLIF(field3, 'NULL') 
+0

¿hay una manera rápida de hacer esto para todos los campos? – woggles

+1

@HLGEM: Tiene un error donde está actualizando field3 a field2. También recomendaría usar: ', field3 = NULLIF (field3, 'NULL')' –

1

No debe tardar 30 minutos en averiguar dónde está el nulo. Solo tienes tantas columnas Simplemente comience a seleccionar desde #temp WHERE col1 IS NULL, luego WHERE col2.

Si #temp tiene una columna VARCHAR que intentas poner en la columna INT y luego echarla. Si hay NULL, es posible que desee manejarlos con un CAST (ISNULL (VarCharColumn, '0') AS INT) o algo así. Si una columna INT permite NULLS, entonces solo el lanzamiento a INT debería ser suficiente (siempre que todos los valores sean NULL o un int válido).

Si escribe su INSERT con un poco más de cuidado, entonces debería poder obtener los resultados que desea.

+0

¡Tantas columnas son alrededor de 150! Finalmente lo resolvió, así que eso es alrededor de 1 hora y media de trabajo de mono, incluidos los errores que siguieron. Todos los errores estuvieron relacionados con la inserción de 'null' de excel. – woggles

+0

@woggles Eso ... es una cantidad ridícula de columnas. Me alegro de no estar trabajando en ese esquema. Mis condolencias. –

+0

gracias! desafortunadamente, ¡la cantidad de columnas por tabla no es la peor parte del esquema! – woggles

0

Vas a necesitar algo de ensayo y error como @ Jeremy señaló. Pero puedes aventar las opciones.

El mensaje de error dice que el problema es un NULL en una columna varchar. Puede restringir su búsqueda a solo las columnas varchar en #temp: select * from #temp where col1 is null or col3 is null

En segundo lugar, el problema también ocurre cuando el motor de base de datos intenta convertir un valor varchar nulo a integer not null. Compare las definiciones de ambas tablas para ver dónde coincide un varchar en #temp con un integer not null en la otra tabla.

Esto, sin embargo, es sospechoso. ¿Por qué estás tratando de convertir texto a números? Si eso es lo que realmente quieres hacer, probablemente necesites un elenco explícito de textual a numérico.

Cuestiones relacionadas