2015-12-09 14 views
6

quindi ho una table con una colonna di tipo VARCHAR (100) e mi chiedo se c'è un modo per configurare SQL Server 2012 (T-SQL) in modo che se una transazione tenta di presentare una serie di 101+ caratteri allora prende il primo 100.Come posso rendere SQL Server 2012 troncato inserimenti se sono troppo grandi?

E 'possibile, o devo fare il truncation nel lato C# delle cose ???

+0

Puoi pubblicare la tua istruzione 'INSERT'? –

+2

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

risposta

4

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

0

Il mio suggerimento sarebbe quello di rendere l'applicazione responsabile della convalida dell'input prima di chiamare qualsiasi operazione DB.

SQL Server tronca in modo silenzioso qualsiasi specificato comesulla lunghezza dello varchar. Quindi dovresti provare a considerare stored procedures per i tuoi requisiti. Quindi verrà gestito automaticamente.

1

Effettuare ciò a livello di codice. Quando si inserisce la lunghezza del campo di controllo del campo corrente e la sua sottostringa.

string a = "string with more than 100 symbols"; 

if(a.Length > 100) 
    a = a.Substring(0, 100); 

Dopo aver aggiunto un parametro sql alla query di inserimento.

L'altro modo è farlo nella query, ma di nuovo non consiglio di farlo.

INSERT INTO Table1('YourColumn') VALUES(LEFT(RTRIM(stringMoreThan100symbols), 100)) 

LEFT sta tagliando la corda e RTRIM sta eseguendo un'operazione Trim della stringa.

+0

C'è un modo per ottenere la lunghezza delle colonne 'VARCHAR' in modo da non avere il" numero magico "100 in giro? – user5648283

+0

@ user5648283: puoi trovare [Dimensione colonna e dataType da getschemaTable] (http://stackoverflow.com/a/17211438/3796048) –

Problemi correlati