为啥我在使用 isNull 时收到此错误消息

Posted

技术标签:

【中文标题】为啥我在使用 isNull 时收到此错误消息【英文标题】:Why am I getting this error message when using isNull为什么我在使用 isNull 时收到此错误消息 【发布时间】:2018-04-23 23:30:48 【问题描述】:

我有这个可以工作的更新触发器,除了它记录列,即使新旧值相同。 (这是因为 EntityFramework 更新语句的方式)。

set nocount on;
    create table #updatedCols (Id int identity(1, 1), updateCol nvarchar(200))

    --find all columns that were updated and write them to temp table
    insert into #updatedCols (updateCol)
    select
        column_name
    from
        information_schema.columns
    where   
        table_name = 'Items'   
        and convert(varbinary, reverse(columns_updated())) & power(convert(bigint, 2), ordinal_position - 1) > 0

    --temp tables are used because inserted and deleted tables are not available in dynamic SQL
    select * into #tempInserted from inserted
    select * into #tempDeleted from deleted

    declare @cnt int = 1
    declare @rowCnt int
    declare @columnName varchar(1000)
    declare @sql nvarchar(4000)

    select @rowCnt = count(*) from #updatedCols

    --execute insert statement for each updated column
    while @cnt <= @rowCnt
    begin
        select @columnName = updateCol from #updatedCols where id = @cnt

        set @sql = N'
            insert into [Events] ([RecordId], [EventTypeId], [EventDate], [ColumnName], [OriginalValue], [NewValue], [TenantId], [AppUserId], [TableName])
            select
                i.Id, 2, GetUTCDate(), ''' + @columnName + ''', d.' + @columnName + ', i.' + @columnName +', i.TenantId, i.UpdatedBy, ''Item''
            from
                #tempInserted i
                join #tempDeleted d on i.Id = d.Id

            '
        exec sp_executesql @sql
        set @cnt = @cnt + 1
    end

所以我添加了更新的连接以过滤掉值相同的位置:

 #tempDeleted d on i.Id = d.Id and isnull(i.' + @columnName + ', '''') <> isnull(d.' +@columnName + ', '''')

但是,我现在收到错误:SqlException: Error converting data type varchar to numeric.

我猜测在某些情况下旧值是 null(因此被转换为空字符串),而新值是 int,因此 Sql Server 尝试将 varchar 转换为 int 以便比较它们并抛出错误。

这是正确的吗?如果是这样,我该如何解决?

【问题讨论】:

【参考方案1】:

如果您不想参数化变量,请执行以下操作

isnull(i.' + convert(varchar(100),@columnName) + ', '''')

否则使用参数定义选项

https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql?view=sql-server-2017

【讨论】:

我不知道你所说的“使用参数定义”是什么意思。可以举个例子吗? 请看上面的链接

以上是关于为啥我在使用 isNull 时收到此错误消息的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在打开我的 wordpress 网站时收到此消息(如何解决)?

为啥在我的反应形式中此 FormArray 更改后,我从 JSON 文件中检索对象时收到此错误消息?

为啥我在使用 pip install 命令时会收到此错误 [重复]

为啥我在使用 npm 时收到此错误,我该如何解决?

为啥我在尝试将它与目标 c 一起使用时会收到错误消息,即我的 json 末尾有垃圾?

为啥我在从 Java 批量执行 PostgreSQL 存储过程时收到错误消息,提示“未预期结果”?