2015-08-22 2 views
1

У меня есть этот бит кода, читаемый в файле фиксированной ширины в таблицу с одним столбцом «A», который создается как varchar (300), после чего считывает эту таблицу как ...

, и в большинстве случаев он возвращает 4-значный год. Я встретив ошибку, когда у меня есть опечатка в файле, который я получил, где год является «20» так
LTRIM(RTRIM(CONVERT(VARBINARY,SUBSTRING(A,101,4))))
возвращает 20, и я хотел бы поставить в где заявление фильтр, который говорит, что
LEN(LTRIM(RTRIM(CONVERT(VARBINARY,SUBSTRING(A,101,4))))) = 4
TSQL LEN (Подстрока), возвращающий неправильный номер

проблема, когда я бегу
LEN(LTRIM(RTRIM(CONVERT(VARBINARY,SUBSTRING(A,101,4)))))
в выбранном заявлении «20» показывается как имеющий 4 LEN. Что это делает?

Я не уверен, почему именно VARBINARY есть, я думаю, что это имеет какое-то значение, когда значение из мэйнфрейма задано как целое, а NULL - как. и это очищает его. Независимо от того, я все еще получаю этот вопрос, когда я удалить CONVERT (VARBINARY.

+1

Что такое преобразование в VARBINARY? Кроме того, что происходит после даты (i, e, это последние данные в строке, если вы не собираете '20', а затем первые 2 символа следующего). – JohnLBevan

+0

Иногда есть «.». вместо числа и преобразования, ltrim и rtrim помогают очистить его. Даже если я делаю DATALENGTH (SUBSTRING (A, 101,4)), я все еще получаю 4 – DKY

+0

Ответил – DKY

ответ

1

LEN Возвращает количество символов, а не число байтов, из данного выражения строки, за исключением хвостовых пробелов.

DATALENGTH Возвращает число байтов, используемых для представления любого выражения. DATALENGTH особенно полезно при использовании VARCHAR, VARBINARY, текст, изображения, NVARCHAR и NTEXT типов данных, так как эти типы данных могут хранить данные переменной длины. DATALENGTH из NULL является значение NULL.

EDIT

Думаю, я понял. Много раз вы упоминаете о «.». По-моему, у вас есть значение float, которое неявно преобразуется в varchar. Проверьте ниже.

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

DATALENGTH(LTRIM(RTRIM(CONVERT(VARBINARY,SUBSTRING(A,101,4)))))
Все еще возвращает a 4 – DKY

+1

Пожалуйста, укажите образец A и его тип. Вероятно, новые строковые символы, которые не обрезаются при преобразовании в varbinary. – lad2025

+0

Обычно это выглядит как 20150820, но в этом случае это всего лишь номер 20, поэтому я использую кучу подстрок, чтобы перевести цифры в формат даты. В этом случае я пытаюсь найти, когда год не составляет ровно 4 цифры, а затем не втягивает запись. – DKY

Смежные вопросы