2012-09-28 183 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

相關問題