客户输入之一是较大的 JSON PAYLOAD 。 1000+ JSON PAYLOAD的ReceiptID字段包含“ NULL” /“其他单词”,而不是有效的Blank / AlphaNumeric / Numeric。
现在使用以下基于COALESCE和ISNULL的两个查询来缩小较小的子集。但是,最好的快速方法是将它们过滤到新的dirtyRowTable中,这将有助于要求客户端重播相同的内容。
使用以下两个查询来查找包含错误数据的确切行。
-在使用ISNULL的SQL下面,返回所有1000行
Select top 1000 EventStoreId,
isnull(JSON_VALUE(payload,'$.ReceiptId'),0) ReceiptId
from dbo.EventStore order by 1 desc
-下面使用COALESCE的另一条SQL仅返回512行,并且由于第513行的值为'NULL'而导致错误。 (错误:消息245,级别16,状态1,第16行 将nvarchar值'NULL'转换为数据类型int时转换失败。
Select top 1000 EventStoreId,
COALESCE(JSON_VALUE(payload,'$.ReceiptId'),0) ReceiptId
from dbo.EventStore order by 1 desc
答案 0 :(得分:0)
COALESCE()
-尽管是标准的-但它的缺点是它会两次评估第一个参数。因此,当第一个参数很重要时,在SQL Server中,ISNULL()
是更好的方法。
也就是说,ISNULL()
表达式的类型是第一个表达式的类型。因此,它正在返回一个字符串。编写代码的更好方法是避免隐式类型转换:
ISNULL(JSON_VALUE(payload, '$.ReceiptId'), N'0') ReceiptId