2012-09-28 82 views
2

以下是用于捕获SQL表上更新/插入的触发器。我无法弄清楚为什么,但每当更新完成后,我都会收到错误消息转换日期和/或时间从字符串转换失败。这里是事务日志表的结构:T-SQL:从字符串中转换日期和/或时间时转换失败

CREATE TABLE [dbo].[TransactionLog](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [TransactionDate] [datetime] NOT NULL, 
    [Operator] [varchar](35) NOT NULL, 
    [TableName] [varchar](50) NOT NULL, 
    [Action] [char](1) NOT NULL, 
    [TableString] [nvarchar](255) NOT NULL, 
    [UserId] [char](6) NULL, 
CONSTRAINT [PK_TransactionLog] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] 
) ON [PRIMARY] 

下面是表被更新:

CREATE TABLE [dbo].[AgentContEd](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [sNumber] [int] NOT NULL, 
    [StateCode] [char](3) NOT NULL, 
    [CourseCode] [char](6) NOT NULL, 
    [DateTaken] [date] NOT NULL, 
    [ExpirationDate] [date] NULL, 
    [CourseHours] [smallint] NOT NULL, 
    [Method] [varchar](15) NULL, 
    [LastChangeOperator] [char](8) NOT NULL, 
    [LastChangeDate] [datetime] NOT NULL, 
    [ControlId] [int] NULL, 
CONSTRAINT [PK_AgentContEd] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] 
) ON [PRIMARY] 

,这里是这是造成头痛的触发...

BEGIN 
    INSERT INTO dbo.TransactionLog 
    (
     TransactionDate, 
     Operator, 
     TableName, 
     Action, 
     TableString, 
     UserId 
    ) 
    SELECT 
     LastChangeDate, 
     'Op', 
     @tableName, 
     @action, 
     CAST(
      'ID:'    + CAST(ISNULL(Id,    'NULL') as char(4)) 
     + ' SymNum:'  + CAST(ISNULL(sNumber, 'NULL') as char(10)) 
     + ' StateCode:'  + ISNULL(StateCode,   'NULL') 
     + ' DateTaken:'  + CAST(ISNULL(DateTaken,  'NULL') as nvarchar(9)) 
     + ' ExpDate:'  + CAST(ISNULL(ExpirationDate, 'NULL') as nvarchar(9)) 
     + ' CourseCode:' + ISNULL(CourseCode,   'NULL') 
     + ' Hours:'   + CAST(ISNULL(CourseHours, 'NULL') as char(3)) 
     + ' Mthd:'   + ISNULL(Method,    'NULL') 
     As char(255)), 
     LastChangeOperator 
    FROM inserted 
END 
+1

这是一个**之前**或**之后**插入触发器? – jTC

+0

这是一个后触发器 – NealR

回答

1

尝试

+ ' DateTaken:'  + ISNULL(CAST(DateTaken as varchar(9)),  'NULL') 
    + ' ExpDate:'  + ISNULL(CAST(ExpirationDate as varchar(9)), 'NULL') 

我用过varchar,因为如果您打算在最后将字符串转换为char,似乎无意使用nvarchar

此外,您可能需要使用CONVERT而不是CAST来存储有用的东西。 SELECT CAST(getdate() as nvarchar(9))为我返回Sep 28 20

A list of formats is here

+0

这工作,谢谢你! – NealR

相关问题