簡體   English   中英

SQL Server 2012(觸發器)操作數類型沖突:int與日期不兼容

[英]SQL Server 2012 (triggers) Operand type clash: int is incompatible with date

我正在構建一個觸發器來將所有更改記錄在表中。 當表中的一列是datetime它可以正常工作。 但是,如果我將其更改為date則在編輯行時會引發此錯誤:

操作數類型沖突:int與日期不兼容

我如何檢查其日期以及是否將其轉換為datetime?

這是代碼(其中@Item包含每列的名稱):

Select * into #tempTrigT from (select * from deleted where @Action in ( 'U','D')) A UNION (select * from inserted where @Action ='I') 

set @sql = '' 

if @Action = 'U'
BEGIN
Select @sql = @sql + 'Case when IsNull(i.[' + Column_Name +  
'],0) = IsNull(d.[' + Column_name + '],0) then ''''  
 else ' + quotename(Column_Name, char(39)) + ' + '',''' + ' end +' 
from information_schema.columns  
where table_name = 'FormFields' and column_name <>'rowguid' and column_name <>'modifieddate'
--Define output parameter 
set @ParmDefinition = '@OutString varchar(max) OUTPUT' 
--Format sql 
set @sql = 'Select @OutString = '  
+ Substring(@sql,1 , len(@sql) -1) +  
' From dbo.FormFields i  ' --Will need to be updated for target schema 
+ ' inner join #tempTrigT d on 
i.id = d.id'  --Will need to be updated for target schema 
--Execute sql and retrieve desired column list in output parameter 
exec sp_executesql @sql, @ParmDefinition, @OutString OUT 

END

DECLARE @Items VARCHAR(max)



set @Items = @OutString;

 DECLARE @Item VARCHAR(50)
 DECLARE @Pos INT
 DECLARE @Loop BIT
 SELECT @Loop = CASE WHEN LEN(@OutString) > 0 THEN 1 ELSE 0 END
 WHILE (SELECT @Loop) = 1
 BEGIN
 SELECT @Pos = CHARINDEX(',', @OutString, 1)
 IF @Pos > 0
 BEGIN
 SELECT @Item = SUBSTRING(@OutString, 1, @Pos - 1)
 SELECT @OutString = SUBSTRING(@OutString, @Pos + 1, LEN(@OutString) - @Pos)
----------------------------------

set @audit_field = @Item;

set @sql = 'select @audit_oldvalue=[' +@Item +'] from #tempTrigT';
EXEC SP_EXECUTESQL @sql,N'@audit_oldvalue sql_variant OUTPUT',@audit_oldvalue OUTPUT -- If inserted @audit_oldvalue gets the new value

set @sql = 'select @audit_value=i.[' +@Item +'] from dbo.FormFields i  inner join #tempTrigT d on i.id = d.id';
EXEC SP_EXECUTESQL @sql,N'@audit_value sql_variant OUTPUT',@audit_value OUTPUT


if @Action = 'U'
begin
    insert into [dbo].[AuditTrailFormFields]([TSid],[TSField],[OldValue],[NewValue],[changedate],[Change_Action],[Change_user],[Columns_Updated])
    select id,@audit_field, @audit_oldvalue, @audit_value,getdate(),@Action, coalesce(ModifiedBy,suser_name()), @Items
    from inserted 

end
Select @sql = @sql + 
    'Case when IsNull(i.[' + Column_Name +  
'],' + CASE DATA_TYPE
         WHEN 'uniqueidentifier' THEN '''0'''
         WHEN 'varchar' THEN CHAR(39) + '-' + CHAR(39)
         WHEN 'nvarchar' THEN CHAR(39) + '-' + CHAR(39)
         WHEN 'date' THEN CHAR(39) + '1/1/1900' + CHAR(39)
         WHEN 'datetime' THEN CHAR(39) + '1/1/1900 00:00:00' + CHAR(39)
         ELSE '0'
       END + ') = IsNull(d.[' + Column_name + '],'+
       CASE DATA_TYPE
         WHEN 'uniqueidentifier' THEN '''0'''
         WHEN 'varchar' THEN CHAR(39) + '-' + CHAR(39)
         WHEN 'nvarchar' THEN CHAR(39) + '-' + CHAR(39)
         WHEN 'date' THEN CHAR(39) + '1/1/1900' + CHAR(39)
         WHEN 'datetime' THEN CHAR(39) + '1/1/1900 00:00:00' + CHAR(39)
         ELSE '0'
       END + ') then ''''  
 else ' + quotename(Column_Name, char(39)) + ' + '',''' + ' end +'
from information_schema.columns  
where table_name = 'CTFormFields' and column_name <>'rowguid' and column_name <>'modifieddate'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM