Erreur: datatables string ou binarys sont tronquées

Im obtenant ceci en exécutant une requête comme ceci SANS insertion dans n'importe quelle table. dans SSMS 2008.

select iav.* from ITEM_ATTRIBUTE_VALUE iav where iav.atsortingbute_value != '' and ISNUMERIC(iav.atsortingbute_value) = 0 

Pourquoi ferait-il cela?

Pour commencer, vous voudrez probablement "<>" par opposition à "! =" Dans SQL Server.

En outre, ISNUMERIC devra probablement tronquer iav.atsortingbute_value pour essayer et tester s'il s'agit d'un nombre, probablement à la longueur de l'entier maximum qui est 2147483647 (signé) – donc à 10 caractères de long – d'où l'avertissement.

Modifier:

Si vous regardez la spécification d'ISNUMERIC, vous pouvez voir qu'il cherche n'importe quoi jusqu'à BIGINT.

Le maximum de BIGINT est de 9223372036854775807, ce qui fait 19 caractères. Donc, si votre atsortingbut_value est supérieur à 19 caractères, il sera tronqué dans une tentative de test. Il s'agit d'un nombre valide qui est utilisable dans SQL Server.

Est-il possible que la longueur de tous les champs renvoyés soit supérieure à 8000 caractères?

Je pense que cela pourrait causer cette erreur.
Essayez de renvoyer uniquement les colonnes dont vous avez besoin, ou seulement une partie d'une colonne, si celle-ci dépasse 8000 caractères.

La raison principale est que l'on doit prendre une table temporaire (ou quelque chose de similaire) dans la procédure stockée et le type de données de la table temporaire et que le type de données de la table réelle doit avoir une taille différente.

ISNUMERIC a une limite de caractères de 308 caractères entiers et dans certains cas 309 caractères pour lesquels il returnnera vrai si c'est le cas, après un certain nombre de caractères, il donnera l'erreur mentionnée ci-dessus.

La meilleure façon de faire la vérification ISNUMERIC est de split votre string en 300 sections char, de valider chaque section et de renvoyer la réponse. Cela peut être réalisé via la fonction ou tout simplement via le code

 DECLARE @incomingSsortingng VARCHAR(MAX) = '133450276206256972456897349683... Until 999999' DECLARE @parts INT = 1 DECLARE @Count INT = 0 DECLARE @ISNUMERIC BIT = 1 WHILE(@parts * 300 < LEN(@incomingSsortingng)) SET @parts = @parts + 1 WHILE(@Count < @parts) BEGIN SET @Count = @Count + 1 IF(ISNUMERIC(SUBSTRING(@incomingSsortingng, (@Count * 300) - 299, 300)) = 0) SET @ISNUMERIC = 0 END SELECT CASE WHEN @ISNUMERIC = 0 THEN 'FAIL' ELSE 'SUCCESS' END