IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

[SQL Server 2005] - LTRIM inefficace


Sujet :

MS SQL Server

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut [SQL Server 2005] - LTRIM inefficace
    Bonjour,

    j'ai le problème suivant :
    J'ai une table contenant des données numériques, mais dans un format NVARCHAR
    Je souhaite, pour effectuer certains calculs, caster ces données en DECIMAL.

    Or je me suis rendu compte que bizarrement, si la colonne contient des espaces, SQL est incapable d'effectuer le cast en numérique

    Exemple 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select cast(' 2 ' as decimal)
    select convert(decimal,' 2 ')
    fonctionnent,
    mais
    Exemple 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select cast(Margin as decimal) from sysadm.pricing
    select convert(decimal,Margin) from sysadm.pricing
    ne fonctionne pas : Error converting data type nvarchar to numeric

    De même, si j'essaye de virer les espaces à la main avec des trim et replace, le comportement est à nouveau le même : en passant les paramètres directement en dur (Exemple 1), ca passe, mais en appelant les fonctions sur une colonne (Exemple 2), ca ne passe pas.

    Pouvez-vous m'expliquer ce comportement étrange ?

    EDIT :

    En fait, il s'agit apparemment d'un problème sur ma table. Je viens de créer une table de test, et je ne rencontre pas le même problème.
    De plus, lorsque je génère le script de création de ma table, j'obtiens le curieux résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    USE [USProj_dev]
    GO
    /****** Objet*:  Table [SYSADM].[pricing]    Date de génération du script*: 06/04/2009 11:48:32 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [SYSADM].[pricing](
    	[Ready_mix_volume] [nvarchar](30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    	[ABC_class] [varchar](30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    	[Sales_district] [varchar](5) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    	[Sales_group] [nvarchar](7) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    	[type] [varchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    	[Sales_Office] [varchar](4) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    	[rid] [varchar](32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    	[rmod] [varchar](32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    	[nrid] [decimal](15, 0) NOT NULL,
    	[dmod] [datetime] NULL,
    	[template] [int] NULL
    ) ON [PRIMARY]
    SET ANSI_PADDING OFF
    ALTER TABLE [SYSADM].[pricing] ADD [ClefUnique] [varchar](30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
    ALTER TABLE [SYSADM].[pricing] ADD [End_of_month_date] [datetime] NULL
    SET ANSI_PADDING ON
    ALTER TABLE [SYSADM].[pricing] ADD [contract_number] [varchar](30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
    ALTER TABLE [SYSADM].[pricing] ADD [clef_unique] [varchar](60) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
    ALTER TABLE [SYSADM].[pricing] ADD [correlation_ID] [varchar](60) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
    ALTER TABLE [SYSADM].[pricing] ADD [Margin] [nvarchar](30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
    ALTER TABLE [SYSADM].[pricing] ADD [Turnover] [nvarchar](30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
    /****** Objet*:  Index [pk_x_pricingnrid]    Date de génération du script*: 06/04/2009 11:48:33 ******/
    ALTER TABLE [SYSADM].[pricing] ADD  CONSTRAINT [pk_x_pricingnrid] PRIMARY KEY CLUSTERED 
    (
    	[nrid] ASC
    )WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
     
    GO
    SET ANSI_PADDING OFF
    C'est quoi ces ALTER ??? C'est normal que ca se génère comme ca ?

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut
    Citation Envoyé par nox75 Voir le message
    Bonjour,

    De même, si j'essaye de virer les espaces à la main avec des trim et replace, le comportement est à nouveau le même : en passant les paramètres directement en dur (Exemple 1), ca passe, mais en appelant les fonctions sur une colonne (Exemple 2), ca ne passe pas.

    Pouvez-vous m'expliquer ce comportement étrange ?
    Il se peut que ce ne soit pas des espaces, mais des caractères non visibles.
    il faudrait isoler les valeurs qui ne se convertissent pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Margin, ASCII(Margin)
    FROM ...
    WHERE ISNUMERIC(Margin)<>1
    Ca te donnera le code ascii du premier caractère, pour les suivants il faut faire du substring

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Bonjour,

    Effectivement, ca me donne 160
    En fait, d'après mon ami google, ce problème survient lorsqu'on charge une table à partir d'Excel. Dans excel le code espace est 160 (espace insécable), mais ca n'est pas reconnu comme un espace dans SQL, d'où l'échec des trim, cast et autres joyeusetés !

    Un mystère de résolu donc ! Merci beaucoup !

    Et la question bonus ? Pourquoi le script de génération de ma table comprend des ALTER ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut
    Citation Envoyé par nox75 Voir le message
    Et la question bonus ? Pourquoi le script de génération de ma table comprend des ALTER ?
    Difficile à dire pourquoi. Le script de création de table est généré par Management studio. Il fait plein de requêtes et ensuite crée le script. Je vois que ton script est entrecoupé de SET ANSI_PADDING, il faut voir si ça ne viens pas de là.

    C'est quoi ta version de Management Studio et de SQL server?

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Microsoft SQL Server Management Studio
    9.00.1399.00

    Outils clients Microsoft Analysis Services
    2005.090.1399.00

    Microsoft Data Access Components (MDAC)
    2000.085.1117.00 (xpsp_sp2_rtm.040803-2158)

    Microsoft MSXML
    2.6 3.0 4.0 5.0 6.0

    Microsoft Internet Explorer
    6.0.2900.2180

    Microsoft .NET Framework
    2.0.50727.1433

    Système d'exploitation
    5.1.2600

    SQL Server 2005

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut
    Citation Envoyé par nox75 Voir le message
    Microsoft SQL Server Management Studio
    9.00.1399.00
    SQL Server 2005
    Mets le service pack 3

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Installation]SQL Server 2005 Express Edition sur XP home
    Par Médiat dans le forum MS SQL Server
    Réponses: 15
    Dernier message: 06/08/2005, 18h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo