Comment puis-je déboguer un triggersur SQL Server qui génère une erreur "La conversion a échoué lors de la conversion de la date et / ou de l'heure à partir de la string de caractères"?

J'ai une application C # avec un backend SQL Server. Dans le backend, j'ai deux tables:

  1. MyTable
  2. MyTableHistory

J'ai juste ajouté un triggersur pour mettre une input dans MyTableHistory quand vous faites une mise à jour sur MyTable . Je reçois et erreur quand j'ajoute ce triggersur:

La conversion a échoué lors de la conversion de la date et / ou de l'heure à partir de la string de caractères

Voici le triggersur:

 CREATE TRIGGER [TU_MyTable] ON dbo.[MyTable] AFTER UPDATE AS SET NOCOUNT ON INSERT INTO dbo.[MyTableHistory] SELECT * FROM deleted GO 

Voici mon schéma de table

 CREATE TABLE dbo.[MyTable] ( [Id] int IDENTITY NOT NULL CONSTRAINT [PK_MyTable] PRIMARY KEY, 1514805185 NOT NULL, [IsDeleted] bit NOT NULL, [Name] nvarchar(200) NOT NULL, [LastUpdated] datetime NOT NULL, [LastUpdatedBy] nvarchar(50) NOT NULL ) GO 

et voici le schéma de la table d'historique

 CREATE TABLE dbo.[MyTableHistory] ( [Id] int NOT NULL, 1514805185 binary(8) NOT NULL, [IsDeleted] bit NOT NULL, CONSTRAINT [PK_MyTableHistory] PRIMARY KEY ([Id], 1514805185), [LastUpdated] datetime NOT NULL, [LastUpdatedBy] nvarchar(50) NOT NULL, [Name] nvarchar(200) NOT NULL ) GO 

Y at-il de toute façon de comprendre quel champ est à l'origine de ce problème et y a-t-il un déboguage à l'intérieur du triggersur de la database pour m'aider à diagnostiquer?

L'erreur est due à la conversion de NVARCHAR en DATETIME . Dans MyTable , la colonne Name est placée avant la colonne LastUpdated . En bref, l'ordre des colonnes dans les deux tables n'est pas le même. Vous devez spécifier les colonnes dans votre instruction INSERT .

 INSERT INTO MyTableHistory( Id, 1514805185, IsDeleted, Name, LastUpdated, LastUpdatedBy ) SELECT Id, 1514805185, IsDeleted, Name, LastUpdated, LastUpdatedBy FROM deleted 

Faire un insert sans list de colonnes est dangereux. Incluez la list et n'utilisez pas * :

 Insert into dbo.[MyTableHistory]([Id], 1514805185, [IsDeleted], [LastUpdated], [LastUpdatedBy], [Name]) SELECT id, 1514805185, IsDeleted, LastUpdated, LastUpdatedBy, Name from deleted; 

Ne dépendez pas de l'ordre des colonnes dans une table – cela provoque des bogues difficiles à find.