TSQL LEN(子字符串)返回错误的编号

TSQL LEN(子字符串)返回错误的编号,tsql,substring,string-length,Tsql,Substring,String Length,我有一段代码在一个固定宽度的文件中读取到一个表中,其中一列“a”被创建为varchar(300),然后将该表读取为。。。 LTRIM(RTRIM(CONVERT(VARBINARY,SUBSTRING(A,101,4))) 在大多数情况下,它返回一个4位数的年份。我遇到了一个错误,我收到的文件中有一个打字错误,那一年是'20'左右 LTRIM(RTRIM(CONVERT(VARBINARY,SUBSTRING(A,101,4))) 返回一个20,我想在where语句中放入一个过滤器 LEN(LT

我有一段代码在一个固定宽度的文件中读取到一个表中,其中一列“a”被创建为varchar(300),然后将该表读取为。。。
LTRIM(RTRIM(CONVERT(VARBINARY,SUBSTRING(A,101,4)))

在大多数情况下,它返回一个4位数的年份。我遇到了一个错误,我收到的文件中有一个打字错误,那一年是'20'左右
LTRIM(RTRIM(CONVERT(VARBINARY,SUBSTRING(A,101,4)))

返回一个20,我想在where语句中放入一个过滤器
LEN(LTRIM(RTRIM(CONVERT(VARBINARY,SUBSTRING(A,101,4))))=4

问题是我什么时候跑步
LEN(LTRIM(RTRIM(CONVERT(VARBINARY,SUBSTRING(A,101,4))))

在select语句中,“20”显示为具有4个LEN。这东西在干什么?

我不确定为什么会有VARBINARY,我认为这与来自大型机的值被设置为integer和NULL有关,它会被设置为“.”,这就清除了它。无论如何,当我删除CONVERT(VARBINARY)时,仍然会遇到这个问题。

返回给定字符串表达式的字符数,而不是字节数,不包括尾随空格

返回用于表示任何表达式的字节数。DATALENGTH对于varchar、varbinary、text、image、nvarchar和ntext数据类型特别有用,因为这些数据类型可以存储可变长度的数据。NULL的DATALENGTH为NULL

编辑

我想我明白了。很多次你提到“.”。在我看来,你有一个浮点值,它被隐式转换为varchar。检查下面

SELECT LEN(t.val), t.val
FROM  (SELECT 20.0) AS t(val)

VARBINARY的转换是为了什么?还有,日期之后是什么(即,它是行中的最后一个数据吗;如果不是,则选择
20
,然后是下一个字符的前两个字符)。有时会出现一个“.”而不是一个数字,转换时,ltrim和rtrim会帮助清理它。即使我使用数据长度(子字符串(a,101,4))我在问题中仍然得到了4response,这是第三次将转换为VARBINARY?将A放入一个变量并再现问题。因此,您添加了绝对没有价值的信息。在问题中发布数据以再现问题。
DATALENGTH(LTRIM(RTRIM(CONVERT(VARBINARY,SUBSTRING(A,101,4 ')))

仍然返回4请提供a及其类型的示例。可能是新行字符,转换为VARBINAL时不会进行修剪。它通常看起来像20150820,但在本例中它只是数字20,因此我使用一组子字符串将数字浓缩为日期格式。在本例中,我尝试查找年份不是e的时间实际上,4位数字不会拉入记录。我理解,但会在源代码的子字符串后粘贴导致记录的数据。
LEN(LTRIM(RTRIM(CONVERT(VARBINARY,**您的数据和类型**)))
。您还可以检查不可打印的字符、BOM等。您还可以更改为
LEN(CONVERT(VARBINARY,(LTRIM(RTRIM(SUBSTRING(A,101,4)))))
,但我仍然不明白为什么要转换为VARBINARY。