sql >> Databasteknik >  >> RDS >> Sqlserver

Konstigt problem med konvertering av SQL Server-typ

Detta är helt förutsägbart och förväntat på grund av Datatypprioritet

För detta kommer UI-kolumnen att ändras till decimal(25,0)

where UI = 2011040773395012950010370

Den här är nästan korrekt. Den högra sidan är varchar och ändras till nvarchar

where UI = '2011040773395012950010370'

Det här är på riktigt korrekt version där båda typerna är samma

where UI = N'2011040773395012950010370'

Fel kommer att ha startat eftersom UI-kolumnen nu innehåller ett värde som inte CAST till decimal(25,0).

Några orelaterade anteckningar:

  • om du har ett index i UI-kolumnen skulle det ignoreras i den första versionen på grund av den implicita CAST som krävs
  • behöver du unicode för att lagra numeriska siffror? Det finns en allvarlig omkostnad med unicode-datatyper i lagring och prestanda
  • varför inte använda char(25) eller nchar(25) är värden alltid fast längd? Dina frågor använder för mycket minne som optimerare antar en genomsnittlig längd på 128 tecken baserat på nvarchar(256)

Redigera, efter kommentar

Utgå inte från "varför fungerar det ibland" när du inte vet att det fungerar

Exempel:

  • Värdet kunde ha tagits bort och sedan lagts till senare
  • En TOP-sats eller SET ROWCOUNT kan innebära att det anstötande värdet inte nås
  • Frågan kördes aldrig så den kunde inte misslyckas
  • Felet ignoreras tyst av någon annan kod?

Redigera 2 för förhoppningsvis mer klarhet

Chatta

gbn:

Slumpmässigt:

gbn

Som Tao nämner , det är viktigt att förstå att en annan orelaterade kan bryta frågan även om den här är OK.




  1. Hur man använder egenskapen IDENTITY() i SQL Server

  2. Ta bort citattecken som lagts till i kolumnnamn från Excel-import SQL Server 2008

  3. ZF2 redan aktiv fråga förhindrar exekvering

  4. Den lagrade proceduren för att hämta instansinställningarna