none
Probléme CAST d'une date sur un script généré automatique pas SQL Management RRS feed

  • Question

  • Bonjour à tous :) , 

    Depuis SQL Management studio et d'une base de données qui contient des enregistrements j'ai généré un script  (click droit sur la base->Tâches->générer des scripts...), ce script contient la création de la table et de ses données mais lorsque je souhaite l'exécuter sur une nouvelle base il m'indique une erreur sur le cast du datetime.

    La ligne qui me pose problème et celle contenant "CAST(N'2012-01-20 15:15:15.000' AS DateTime)", SQL me traduit le jour 20 comme étant le mois et cela ne fonctionne pas ce qui est logique. Si j'ajoute la lettre T dans la chaine pour indiqué le début de l'heure cela fonctionne , si je remplace "AS Datetime" par "As DateTime2" ça fonctionne et si je supprime les tirets au niveau de la date ça fonctionne aussi.

    pourquoi le script généré automatiquement par SQL Management ne fonctionne pas ? est ce que j'ai oublié quelque chose ? est ce qu'il y a un paramétrage quelque part ?

    Un exemple du script qui est généré et qui me pose problème (ce n'est pas la base sur laquelle je travaille mais c'est le même problème)

    USE [db_test]
    GO
    /****** Object:  Table [dbo].[dt_list]    Script Date: 12/12/2018 17:14:39 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[dt_list](
    	[id] [int] IDENTITY(1,1) NOT NULL,
    	[StartDateTime] [datetime] NULL
    ) ON [PRIMARY]
    
    GO
    SET IDENTITY_INSERT [dbo].[dt_list] ON 
    
    GO
    INSERT [dbo].[dt_list] ([id], [StartDateTime]) VALUES (1, CAST(N'2018-01-01 15:15:15.000' AS DateTime))
    GO
    INSERT [dbo].[dt_list] ([id], [StartDateTime]) VALUES (2, CAST(N'2012-01-20 15:15:15.000' AS DateTime))
    GO
    SET IDENTITY_INSERT [dbo].[dt_list] OFF
    GO

    Je vous remercie par avance :) 

    mercredi 12 décembre 2018 16:54

Toutes les réponses

  • Salut

    Ahhhh, les dates, éternel problème.
    Bon, OK, on ne peut pas dire que SSMS sur le coup soit bien carré. La problématique vient de la langue configurée au niveau du la connexion utilisée (sa ou autre compte SQL, compte windows).

    On peut modifier cette propriété et relancer les insert (après reconnexion).

    On peut aussi jouer sur le paramètre de session avec les fameux SET DATEFORMAT dmy; et SET DATEFORMAT mdy;

    Mais je préfèrerais passer par la fonction DateTimeFromParts qui supprime toute ambiguïté.

    cdlt

    Christophe


    Christophe LAPORTE - Independent Consultant & Trainer - SQL Server MVP-MCM

    jeudi 10 janvier 2019 08:21