为啥我在使用 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 命令时会收到此错误 [重复]