如何使用 LRTIM 和 RTRIM 查找无效记录并将其插入错误表?

Posted

技术标签:

【中文标题】如何使用 LRTIM 和 RTRIM 查找无效记录并将其插入错误表?【英文标题】:how can i use LRTIM and RTRIM to find invalid records and insert it into error table? 【发布时间】:2011-01-25 19:18:41 【问题描述】:

我有一个查询,可以从表中的每一列中查找无效记录。但是所有列的数据类型的长度并不相同。我这样说是因为当我使用 LTRIM 和 RTRIM 时,它会给出错误“列“SubscriberLastName”的类型与 UNPIVOT 列表中指定的其他列的类型冲突”并且如果我 CAST 该列然后没有结果。

有人可以帮我吗?

Insert into ErrorTable (------) select (-----)
From (
            select [SubscriberDataId]
            ,Case When ltrim(rtrim([SubscriberCode])) = '' Then [SubscriberCode] Else 'CorrectValue' end as [SubscriberCode]
            ,Case When ltrim(rtrim([SubscriberLastName]))= '' Then [SubscriberLastName] Else 'CorrectValue' end as [SubscriberLastName]
            ,Case When ltrim(rtrim([SubscriberFirstName]))= ''  Then [SubscriberFirstName] Else 'CorrectValue' end as [SubscriberFirstName]
            from Facets.SubscriberData) [sd]
            Unpivot
            (ErrorValue for FieldName in ([SubscriberCode],
            [SubscriberLastName],[SubscriberFirstName] )) as x
            where x.ErrorValue <> 'CorrectValue'

【问题讨论】:

【参考方案1】:

您需要确保类型相同,而不仅仅是长度。

Insert into ErrorTable (------) select (-----)
From (
            select [SubscriberDataId]
            ,Case When ltrim(rtrim([SubscriberCode])) = '' Then CAST([SubscriberCode] AS NVARCHAR(MAX)) Else 'CorrectValue' end as [SubscriberCode]
            ,Case When ltrim(rtrim([SubscriberLastName]))= '' Then CAST([SubscriberLastName] AS NVARCHAR(MAX)) Else 'CorrectValue' end as [SubscriberLastName]
            ,Case When ltrim(rtrim([SubscriberFirstName]))= ''  Then CAST([SubscriberFirstName] AS NVARCHAR(MAX)) Else 'CorrectValue' end as [SubscriberFirstName]
            from Facets.SubscriberData) [sd]
            Unpivot
            (ErrorValue for FieldName in ([SubscriberCode],
            [SubscriberLastName],[SubscriberFirstName] )) as x
            where x.ErrorValue <> 'CorrectValue'

【讨论】:

嗨@Cyber​​kiwi,感谢您的回复,我已经尝试过了,但我没有得到任何结果。我得到 3 列 SubscriberDataId、ErrorValue 和 FieldName,所有 3 列都是空白的。 这个select [SubscriberDataId] ,Case When .... [SubscriberFirstName] from Facets.SubscriberData(内部选择)你能得到什么 - 将它添加到问题中 我得到,在 SubscriberDataId (1,2,3....) 和 SubscriberFirstName (CorrectValue,CorrectValue...) 下 @Programmer:您的脚本似乎只选择(并插入) 个空白值。你实际上打算做什么?我的意思是,在取消透视之前,您可以看到某些列为空白的完整行,但是在取消透视后 应用过滤器后,您只能得到空白,因为所有 CorrectValues 都被过滤掉了。这不是你的真实意图吗?还有一件事:在比较字符串时,SQL Server 中会忽略尾随空格,因此您不需要RTRIM。而且,正如您实际上与'' 相比,LTRIM 也不需要。

以上是关于如何使用 LRTIM 和 RTRIM 查找无效记录并将其插入错误表?的主要内容,如果未能解决你的问题,请参考以下文章

PHP学习记录

sqlserver中一些常用的函数总结

关于SQL中ltrim和rtrim的使用

如何在 R 的并行方法中使用无效的记录器进行记录?

无效的 XML 字符错误 - 如何从 VARCHAR2 数据库列中查找无效字符?

SQL 字符操作