0
votes

SQL Server 2017 a évalué un morceau de code qui ne devrait jamais être évalué

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE fb_lab_test
(
    [id] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
    [Test_No] [varchar](50) NULL,
    [execute_date] [datetime] NULL,
    [PatientId] [varchar](20) NULL,
    [Visit_Id] [varchar](10) NULL,
    [Patient_Type] [int] NULL,
    [PatientName] [varchar](100) NULL,
    [result_date_time] [datetime] NULL,
    [report_item_name] [varchar](256) NULL,
    [report_item_code] [varchar](50) NULL,
    [result] [varchar](100) NULL
) ON [PRIMARY]
GO

INSERT INTO fb_lab_test 
VALUES ('5910315197','2019-10-31 00:40:53.000','111111','1','1','Tom','2019-10-31 08:56:54.000','test1','KET','-')

0 commentaires

3 Réponses :


1
votes

Dans mon cas (en utilisant vos données) une erreur n'est pas lancée. Parfois, le moteur décide d'effectuer des opérations à l'avance (afin d'optimiser une requête particulière). Je crois, vous obtenez une erreur en raison de ce comportement.

Vous pouvez le réparer en utilisant try_cast : xxx


0 commentaires

0
votes

Il se comporte en réalité par la documentation ...

Isnumeric retourne 1 pour certains caractères qui ne sont pas des chiffres, tels que plus (+), moins (-) et des symboles de devise valides tels que le signe dollar ($). Pour une liste complète des symboles monétaires, voir l'argent et la petite monnaie (transact-sql).

https://docs.microsoft.com/en-us/sql/t-sql/functions/isnumeric-Transact-SQL?View=SQL-Server-ver15

SQL Server renvoie un message d'erreur lors de la conversion de données de caractères nonNumériques, NCHAR, NVARCHAR ou VARCHAR sur Decimal, Float, Int, Numérique. SQL Server renvoie également une erreur lorsqu'une chaîne vide ("") est convertie en numérique ou en décimal.

https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-Transact-sql?view=SQL-Server-ver15

Si vous avez besoin de le convertir dans une seule expression, je vous suggère d'utiliser un type d'argent qui prend en charge jusqu'à 4 décimales. Sinon, vous devez faire face aux valeurs de numéro «possibles» de + - . etc ...


3 commentaires

J'ai remplacé le isnumeric (résultat) avec Patindex ('% [^ 0-9 |]%', résultat) , mais ce n'est pas le point de la question, cause cas iSnumeric (résultat) lorsque 1 puis coulant (résultat en tant que flotteur) else 10000.0 extrémité> 0.2 ne doit jamais être évalué dans les données d'échantillonnage que je donne, de toute façon merci beaucoup


Case ISnumeric (Résultat) Lorsque le résultat est - Retours 1 C'est pourquoi la distribution est appelée. La documentation SQL Server l'appelle comme telle. Les échantillons de données que vous avez donnés ont le résultat de - .


Mais dans mon exemple de données, il n'y a pas de rapport_item_code nommé 'anti-hbc' ... Désolé pour ma pauvre expression anglaise et peu claire



0
votes

n'utilise pas isnumeric () du tout. Utilisez simplement le Essayez _ Fonctions: xxx

Il est également une bonne idée d'éviter EXPRESSIONS dans le Clause. Ils sont essentiellement court-circuit l'optimiseur.

Dans ce cas, vous souhaitez inclure les valeurs non numériques. Plus souvent, ceux-ci seraient exclus. Vous pouvez simplement laisser le null la comparaison les exclure. Cette logique serait: xxx


0 commentaires