如何使用 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'
【讨论】:
嗨@Cyberkiwi,感谢您的回复,我已经尝试过了,但我没有得到任何结果。我得到 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 查找无效记录并将其插入错误表?的主要内容,如果未能解决你的问题,请参考以下文章