将 varchar 值“-->”转换为数据类型 int 时获取转换失败。我该如何解决这个问题?

Getting Conversion failed when converting the varchar value ' --> ' to data type int. How do I solve this?

我在 table 更新时创建了触发器。这是它的一些代码:

INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john',
             CAST(D.eventStart AS nvarchar(30)) + ' --> ' + CAST(I.eventStart AS nvarchar(30)),
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

我正在使用 CAST,因为 eventStart 是 dateTime2 类型,在这种情况下我希望它是 nvarchar。

我要做的是获取 2 个日期和“-->”并将它们插入字符串(更改)

问题是当我 运行 我得到的应用程序时:

"Conversion failed when converting the varchar value ' --> ' to data type int."

我几乎可以肯定问题与 CAST 行有关。知道为什么以及如何解决这个问题吗?

PS: 更改的类型为 nvarchar(MAX)。

更新:

所有触发代码:

USE [ITApiContext-20150205100935]
GO
/****** Object:  Trigger [dbo].[EventUpdate]    Script Date: 10-Mar-15 11:55:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================

ALTER TRIGGER [dbo].[EventUpdate]
   ON  [dbo].[Events]
   AFTER UPDATE
AS
BEGIN
       SET NOCOUNT ON;

       INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.name + ' --> ' + I.name, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.project + ' --> ' + I.project, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.project + ' --> ' + I.project, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.objectives + ' --> ' + I.objectives, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.city + ' --> ' + I.city, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.country + ' --> ' + I.country, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             (CAST(D.eventStart AS nvarchar(30)) + N' --> ' + CAST(I.eventStart AS nvarchar(30))), 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id



        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             CAST(D.departure AS nvarchar(30)) + N' --> ' + CAST(I.departure AS nvarchar(30)), 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             CAST(D.arrival AS nvarchar(30)) + N' --> ' + CAST(I.arrival AS nvarchar(30)), 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.registration + ' --> ' + I.registration, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.nationalTransportation + ' --> ' + I.nationalTransportation, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.accommodation + ' --> ' + I.accommodation, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.acNumberNights + ' --> ' + I.acNumberNights, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.acPreferHotel + ' --> ' + I.acPreferHotel, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.acPreferHotelUrl + ' --> ' + I.acPreferHotelUrl, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.flight + ' --> ' + I.flight, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             CAST(D.flDeparture AS nvarchar(30)) + N' --> ' + CAST(I.flDeparture AS nvarchar(30)), 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.flDepartPrefer + ' --> ' + I.flDepartPrefer, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.flDepartPreferUrl + ' --> ' + I.flDepartPreferUrl, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             CAST(D.flReturn AS nvarchar(30)) + N' --> ' + CAST(I.flReturn AS nvarchar(30)), 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.flRetPrefer + ' --> ' + I.flDepartPrefer, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.flDepartPreferUrl + ' --> ' + I.flDepartPreferUrl, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.notes+ ' --> ' + I.notes, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id
END

试试这个:

(CAST(D.eventStart AS nvarchar(30)) + N' --> ' + CAST(I.eventStart AS nvarchar(30)))

根据评论,最终成功的方法是:

CAST(CAST(D.eventStart AS nvarchar(30)) + '-->' + CAST(I.eventStart AS nvarchar(30)) AS nvarchar(max))

双重施法为胜利。

尝试使用Try-Catch检测问题出在哪里。检测到真正的问题后将有可能找到解决方案。

还有这一行:D.acNumberNights + ' --> ' + I.acNumberNights,你确定acNumberNightsNVARCHAR的类型吗?不应该给你这个吗?

USE [ITApiContext-20150205100935]
GO
/****** Object:  Trigger [dbo].[EventUpdate]    Script Date: 10-Mar-15 11:55:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================

ALTER TRIGGER [dbo].[EventUpdate]
   ON  [dbo].[Events]
   AFTER UPDATE
AS
BEGIN
  BEGIN TRY
       SET NOCOUNT ON;

       INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.name + ' --> ' + I.name, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.project + ' --> ' + I.project, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.project + ' --> ' + I.project, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.objectives + ' --> ' + I.objectives, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.city + ' --> ' + I.city, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.country + ' --> ' + I.country, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             (CAST(D.eventStart AS nvarchar(30)) + N' --> ' + CAST(I.eventStart AS nvarchar(30))), 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id



        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             CAST(D.departure AS nvarchar(30)) + N' --> ' + CAST(I.departure AS nvarchar(30)), 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             CAST(D.arrival AS nvarchar(30)) + N' --> ' + CAST(I.arrival AS nvarchar(30)), 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.registration + ' --> ' + I.registration, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.nationalTransportation + ' --> ' + I.nationalTransportation, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.accommodation + ' --> ' + I.accommodation, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.acNumberNights + ' --> ' + I.acNumberNights, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.acPreferHotel + ' --> ' + I.acPreferHotel, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.acPreferHotelUrl + ' --> ' + I.acPreferHotelUrl, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.flight + ' --> ' + I.flight, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             CAST(D.flDeparture AS nvarchar(30)) + N' --> ' + CAST(I.flDeparture AS nvarchar(30)), 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.flDepartPrefer + ' --> ' + I.flDepartPrefer, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.flDepartPreferUrl + ' --> ' + I.flDepartPreferUrl, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             CAST(D.flReturn AS nvarchar(30)) + N' --> ' + CAST(I.flReturn AS nvarchar(30)), 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.flRetPrefer + ' --> ' + I.flDepartPrefer, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.flDepartPreferUrl + ' --> ' + I.flDepartPreferUrl, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id

        INSERT INTO [dbo].Logs([date],[name],[changes],[eventId])
             SELECT getdate(), 'john', 
             D.notes+ ' --> ' + I.notes, 
             I.id
             FROM Inserted I
                  INNER JOIN Deleted D ON I.id = D.id
     END TRY
     BEGIN CATCH
        SELECT ERROR_MESSAGE(),
               ERROR_LINE()
     END CATCH
END