【问题标题】:TSQL LEN(Substring) returning wrong numberTSQL LEN(子字符串)返回错误的数字
【发布时间】:2015-11-16 07:39:19
【问题描述】:

我在一个固定宽度的文件中将这段代码读取到一个表中,其中一列“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 存在,我认为它与大型机的值设置为整数和 NULL 它遇到的“。”有关。并清理它。无论如何,当我删除 CONVERT(VARBINARY.

【问题讨论】:

  • 转换为 VARBINARY 的目的是什么?此外,日期之后是什么(即,它是该行中的最后一个数据;如果不是,您将选择20,然后是接下来的前 2 个字符)。
  • 有时会有一个“.” ltrim 和 rtrim 不是数字和转换,而是帮助清理它。即使我做 DATALENGTH(SUBSTRING(A,101,4)) 我仍然得到 4
  • 回答问题并第三次向 VARBINARY 提问?将 A 放入变量中并重现问题。
  • 所以你添加了绝对没有价值的信息。在问题中发布数据以重现问题。

标签: tsql substring string-length


【解决方案1】:

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

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

编辑

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

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

【讨论】:

  • DATALENGTH(LTRIM(RTRIM(CONVERT(VARBINARY,SUBSTRING(A,101,4)))))
    仍然返回一个 4
  • 请提供A的样本及其类型。可能是换行符,转换为 varbinary 时不会修剪。
  • 它通常看起来像 20150820 但在这种情况下它只是数字 20 所以我使用一堆子字符串将数字连接成日期格式。在这种情况下,我试图找出年份不完全是 4 位的时间,然后不要拉入记录。
  • 我理解,但是将导致它的数据粘贴在源子字符串之后。 LEN( LTRIM(RTRIM(CONVERT(VARBINARY, **your_data_and_type** )))) )。您还可以检查它是否有不可打印的字符、BOM 等。
  • 你也可以改成LEN(CONVERT( VARBINARY,(LTRIM(RTRIM(SUBSTRING(A,101,4)))) ),但我还是不明白为什么要转换成VARBINARY。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 2018-04-30
  • 2016-08-27
  • 2012-05-16
相关资源
最近更新 更多