SQL Server 2012 (triggers) Operand type clash: int is incompatible with date -
i building trigger log changes in table. when column in table datetime works fine. if change date throws error when edit row:
operand type clash: int incompatible date
how can check if date , if convert datetime?
here code (where @item contains name of each column):
select * #temptrigt (select * deleted @action in ( 'u','d')) union (select * inserted @action ='i') set @sql = '' if @action = 'u' begin select @sql = @sql + 'case when isnull(i.[' + column_name + '],0) = isnull(d.[' + column_name + '],0) '''' else ' + quotename(column_name, char(39)) + ' + '',''' + ' end +' information_schema.columns table_name = 'formfields' , column_name <>'rowguid' , column_name <>'modifieddate' --define output parameter set @parmdefinition = '@outstring varchar(max) output' --format sql set @sql = 'select @outstring = ' + substring(@sql,1 , len(@sql) -1) + ' dbo.formfields ' --will need updated target schema + ' inner join #temptrigt d on i.id = d.id' --will need updated target schema --execute sql , 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 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 +'] #temptrigt'; exec sp_executesql @sql,n'@audit_oldvalue sql_variant output',@audit_oldvalue output -- if inserted @audit_oldvalue gets new value set @sql = 'select @audit_value=i.[' +@item +'] dbo.formfields 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 [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 inserted end
select @sql = @sql + 'case when isnull(i.[' + column_name + '],' + case data_type when 'uniqueidentifier' '''0''' when 'varchar' char(39) + '-' + char(39) when 'nvarchar' char(39) + '-' + char(39) when 'date' char(39) + '1/1/1900' + char(39) when 'datetime' char(39) + '1/1/1900 00:00:00' + char(39) else '0' end + ') = isnull(d.[' + column_name + '],'+ case data_type when 'uniqueidentifier' '''0''' when 'varchar' char(39) + '-' + char(39) when 'nvarchar' char(39) + '-' + char(39) when 'date' char(39) + '1/1/1900' + char(39) when 'datetime' char(39) + '1/1/1900 00:00:00' + char(39) else '0' end + ') '''' else ' + quotename(column_name, char(39)) + ' + '',''' + ' end +' information_schema.columns table_name = 'ctformfields' , column_name <>'rowguid' , column_name <>'modifieddate'
Comments
Post a Comment