[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:
1 2 3
|
select cast(' 2 ' as decimal)
select convert(decimal,' 2 ') |
fonctionnent,
mais
Exemple 2 :
Code:
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:
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 ?