2009-01-12 11 views
8

Tengo datos de entrada que contienen algunos campos "deshonestos" que son más largos que el campo de base de datos correspondiente. Esto hace que mi script de importación, que utiliza las instrucciones INSERT de SQL a caer con una advertencia:SQL INSERT, forzar campo truncado

Msg 8152, Level 16, State 13, Line 2 
String or binary data would be truncated. 

¿Cómo puedo forzar el truncamiento de estos campos y permitir que mi script para completar?

+0

¿Ha intentado convertir a un varchar de cierta longitud? Si es mayor que la longitud especificada, cortaría el extremo. – TheTXI

Respuesta

8

Al insertar haces algo a lo largo de las líneas de:

INSERT INTO Table1('Column1') VALUES(LEFT(RTRIM(InputField), MaxLength)) 

Usted lo único que almacena los caracteres restantes N con el PP.

+0

Gracias amigo, esto es lo suficientemente bueno (a pesar de que implica la modificación de todas las declaraciones de importación relevantes). – Ben

1

No sé de una manera más fácil que rastrearlos y usar LEFT(). Aunque me encantaría saber si lo hay.

Obviamente, utilizando los metadatos como INFORMATION_SCHEMA.COLUMNS puede determinar esto automáticamente y ejecutarlo para hacer un LEFT() a la longitud adecuada.

6

Personalmente quiero que fallen y luego mirar los datos. No creo que deba considerar el truncamiento automático de datos. Puede que necesite ampliar su definición de campo. No sabrá a menos que inspeccione visualmente las filas que fallarían.

Ejemplo: Almacenamos títulos de voz. Supongamos que tenemos dos títulos:
cómo leer un libro:
cómo leer un libro en la bañera sin que se moje

Ahora bien, si su campo tenía 10 caracteres tanto obtendría truncada a la misma cosa. Además, lo que consiguieron truncado ni siquiera tendría sentido. Ambos dirían "Cómo reaccionar". Ahora no tiene ninguna diferencia entre dos títulos muy diferentes y lo que usted tiene no es correcto de todos modos. Ajustar el campo para almacenar una mayor cantidad de caracteres es claramente lo correcto. Este ejemplo es tonto, pero la basura está dentro, la basura sale. Si trunca los nombres de personas u otros datos críticos, eventualmente tendrá problemas porque tiene datos basura. He visto esto suceder con nuestros títulos de voz, con last_names, con direcciones, con números de teléfono y muchos otros datos. Si tiene que truncar los datos, es más que probable que esté almacenando datos inútiles para ese registro de todos modos. O los datos necesitan una limpieza correcta (como eliminar el() - de un número de teléfono si está diseñado solo para almacenar los números) antes de importar a los datos de producción o el campo debe ser más grande.

+1

+1, pero también podría haber dicho al final: "si realmente lo necesita, use IZQUIERDA()" – jcollum

7

Use Advertencias de Ansi? http://msdn.microsoft.com/en-GB/library/ms190368(v=sql.110).aspx

DECLARE @TABLE TABLE 
(
    Data VARCHAR(3) 
) 

SET ANSI_WARNINGS OFF 

INSERT INTO @TABLE 
VALUES('Hello World') 

SELECT * FROM @TABLE 

SET ANSI_WARNINGS ON 

INSERT INTO @TABLE 
VALUES('Goodbye World') 

SELECT * FROM @TABLE 
+3

En algunas situaciones, este tipo de solución de 'curita' puede ser útil. Sin embargo, pise con cuidado. –