Normalmente, SQL Server presenterà un errore in qualsiasi tentativo di inserire più dati in un campo che può contenere
String o dati binari verrebbero troncati. La dichiarazione è stata chiusa.
SQL Server non consentirà un troncamento silenzioso dei dati solo perché la colonna è troppo piccola per accettare i dati. Ma esistono altri modi in cui SQL Server può troncare i dati che stanno per essere inseriti in una tabella che non genererà alcuna forma di errore o avviso.
Per impostazione predefinita, ANSI_WARNINGS sono attivati e alcune attività come la creazione di indici su colonne calcolate o viste indicizzate richiedono che siano attivate. Ma se sono disattivati, SQL Server troncerà i dati secondo necessità per adattarli alla colonna. I ANSI_WARNINGS impostazione per una sessione possono essere controllati da
SET ANSI_WARNINGS { ON|OFF }
A differenza di un inserto in una tabella, SQL Server tranquillamente tagliare dati che viene assegnato a una variabile, indipendentemente dallo stato di ANSI_WARNINGS. Per esempio:
declare @smallString varchar(5)
declare @testint int
set @smallString = 'This is a long string'
set @testint = 123.456
print @smallString
print @testint
Risultati è:
This
123
Questo può occasionalmente manifestarsi in modo sottile dal superamento di un valore in una stored procedure o funzione assegna alla variabile di parametro e sarà tranquillamente fare una conversione .Un metodo che può aiutare a prevenire questa situazione consiste nel fornire qualsiasi parametro che verrà inserito direttamente in una tabella con un tipo di dati più grande rispetto alla colonna di destinazione, in modo che SQL Server possa generare l'errore, o forse per controllare la lunghezza del parametro e avere codice personalizzato per gestirlo quando è troppo lungo.
Ad esempio, se una stored procedure utilizzerà un parametro per inserire dati in una tabella con una colonna varchar (10), impostare il parametro varchar (15). Quindi se il dato passato è troppo lungo per la colonna, verrà eseguito il rollback e generato un errore di troncamento invece di troncare e inserire silenziosamente. Ovviamente, questo comporta il rischio di essere fuorvianti per chiunque stia guardando le informazioni dell'intestazione delle stored procedure senza capire cosa è stato fatto.
Source: Silent Truncation of SQL Server Data Inserts
fonte
2015-12-09 06:46:30
Puoi pubblicare la tua istruzione 'INSERT'? –
Suppongo che sia possibile eseguire il lato DB, ma probabilmente è una cattiva idea. È meglio averlo nel livello applicazione, altrimenti si verificherà un bug in (diciamo) 6 mesi e non si ha idea del motivo per cui il DB sta corrompendo i dati in modo casuale. – Rob