在大表上过滤掉SQL数据错误的更好方法

时间:2018-07-02 18:45:29

标签: sql sql-server

客户输入之一是较大的 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

1 个答案:

答案 0 :(得分:0)

COALESCE()-尽管是标准的-但它的缺点是它会两次评估第一个参数。因此,当第一个参数很重要时,在SQL Server中,ISNULL()是更好的方法。

也就是说,ISNULL()表达式的类型是第一个表达式的类型。因此,它正在返回一个字符串。编写代码的更好方法是避免隐式类型转换:

ISNULL(JSON_VALUE(payload, '$.ReceiptId'), N'0') ReceiptId