Questo è completamente prevedibile e previsto a causa della Precedenza del tipo di dati
Per questo, la colonna dell'interfaccia utente verrà modificata in decimale(25,0)
where UI = 2011040773395012950010370
Questo è quasi corretto. Il lato destro è varchar e viene cambiato in nvarchar
where UI = '2011040773395012950010370'
Questo è il realmente versione corretta in cui entrambi i tipi sono gli stessi
where UI = N'2011040773395012950010370'
Gli errori saranno iniziati perché la colonna dell'interfaccia utente ora contiene un valore che non verrà trasmesso in decimal(25,0).
Alcune note non correlate:
- se hai un indice nella colonna dell'interfaccia utente, verrebbe ignorato nella prima versione a causa del CAST implicito richiesto
- hai bisogno di unicode per memorizzare cifre numeriche? C'è un grave sovraccarico con tipi di dati unicode in memoria e prestazioni
- perché non usare
char(25)
onchar(25)
i valori sono sempre a lunghezza fissa? Le tue query utilizzano troppo memoria come ottimizzatore presuppone una lunghezza media di 128 caratteri in base anvarchar(256)
Modifica, dopo il commento
Non dare per scontato "perché a volte funziona" quando non lo sai che funziona
Esempi:
- Il valore avrebbe potuto essere eliminato e aggiunto in seguito
- Una clausola TOP o SET ROWCOUNT potrebbe significare che il valore offensivo non è stato raggiunto
- La query non è mai stata eseguita, quindi non poteva fallire
- L'errore viene ignorato silenziosamente da qualche altro codice?
Modifica 2 per una maggiore chiarezza, si spera
Chatta
GB:
Casuale:
GB
Come menziona Tao , è importante capire che un altro non correlato può interrompere la query anche se questa è OK.