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

Mærkeligt SQL Server-type konverteringsproblem

Dette er fuldstændig forudsigeligt og forventet på grund af Datatypeprioritet

Til dette vil UI-kolonnen blive ændret til decimal(25,0)

where UI = 2011040773395012950010370

Denne er næsten korrekt. Den højre side er varchar og er ændret til nvarchar

where UI = '2011040773395012950010370'

Dette er virkelig korrekte version, hvor begge typer er de samme

where UI = N'2011040773395012950010370'

Fejl vil være startet, fordi UI-kolonnen nu indeholder en værdi, der ikke vil CAST til decimal(25,0).

Nogle ikke-relaterede bemærkninger:

  • hvis du har et indeks i UI-kolonnen, vil det blive ignoreret i den første version på grund af den implicitte CAST påkrævet
  • har du brug for unicode for at gemme numeriske cifre? Der er en alvorlig overhead med unicode-datatyper i lagring og ydeevne
  • hvorfor ikke bruge char(25) eller nchar(25) er værdier altid fast længde? Dine forespørgsler bruger for meget hukommelse som optimeringsværktøjet antager en gennemsnitlig længde på 128 tegn baseret på nvarchar(256)

Rediger efter kommentar

Antag ikke "hvorfor virker det nogle gange", når du ikke ved at det virker

Eksempler:

  • Værdien kunne være blevet slettet og tilføjet senere
  • En TOP-sætning eller SET ROWCOUNT kan betyde, at den stødende værdi ikke er nået
  • Forespørgslen blev aldrig kørt, så den kunne ikke mislykkes
  • Fejlen ignoreres stille af en anden kode?

Rediger 2 for forhåbentlig mere klarhed

Chat

gbn:

Tilfældig:

gbn

Som Tao nævner , er det vigtigt at forstå, at en anden ikke-relateret kan bryde forespørgslen, selvom denne er OK.




  1. MySQL-valgstreng med flere specialtegn

  2. ListView Kontrol Træk slip hændelser Håndtering

  3. Hvad er MySQL-alternativet til Oracles NEXT_DAY-funktion?

  4. Oracle Apex:trin for trin tilgang til oprettelse af radioknapper i interaktiv rapport