J'ai une application C # avec un backend SQL Server. Dans le backend, j'ai deux tables:
MyTable
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.