Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Problème étrange de conversion de type SQL Server

Ceci est tout à fait prévisible et attendu en raison de la la priorité des types de données

Pour cela, la colonne UI sera remplacée par decimal(25,0)

where UI = 2011040773395012950010370

Celui-ci est presque correct. Le côté droit est varchar et est changé en nvarchar

where UI = '2011040773395012950010370'

C'est le vraiment version correcte où les deux types sont identiques

where UI = N'2011040773395012950010370'

Les erreurs auront commencé car la colonne UI contient maintenant une valeur qui ne sera pas convertie en décimal (25,0).

Quelques notes sans rapport :

  • si vous avez un index sur la colonne UI, il sera ignoré dans la première version en raison du CAST implicite requis
  • Avez-vous besoin d'Unicode pour stocker des chiffres ? Il y a un un surcoût sérieux avec des types de données Unicode dans le stockage et les performances
  • pourquoi ne pas utiliser char(25) ou nchar(25) est-ce que les valeurs sont toujours de longueur fixe ? Vos requêtes utilisent trop suppose une longueur moyenne de 128 caractères basée sur nvarchar(256)

Modifier, après commentaire

Ne présumez pas "pourquoi ça marche parfois" quand vous ne savez pas que ça marche

Exemples :

  • La valeur aurait pu être supprimée puis ajoutée ultérieurement
  • Une clause TOP ou SET ROWCOUNT peut signifier que la valeur incriminée n'est pas atteinte
  • La requête n'a jamais été exécutée, elle ne pouvait donc pas échouer
  • L'erreur est silencieusement ignorée par un autre code ?

Modifier 2 pour plus de clarté, espérons-le

Discuter

gbn :

Aléatoire :

gbn

Comme le mentionne Tao , il est important de comprendre qu'un autre non lié peut casser la requête même si celui-ci est OK.