Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Strano problema di conversione del tipo di SQL Server

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) o nchar(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 a nvarchar(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.