SQL INSERT, Force Truncate Field - PullRequest
       9

SQL INSERT, Force Truncate Field

8 голосов
/ 12 января 2009

У меня есть входные данные, содержащие несколько «мошеннических» полей, которые длиннее соответствующего поля базы данных. Это приводит к тому, что мой скрипт импорта, который использует операторы SQL INSERT, падает с предупреждением:

Msg 8152, Level 16, State 13, Line 2
String or binary data would be truncated.

Как я могу принудительно усечь эти поля и разрешить выполнение моего скрипта?

Ответы [ 4 ]

10 голосов
/ 12 января 2009

Когда вы вставляете, делайте что-то вроде:

INSERT INTO Table1('Column1') VALUES(LEFT(RTRIM(InputField), MaxLength))

В БД вы будете хранить только левые N символов.

9 голосов
/ 20 мая 2013

Использовать Анси Предупреждения? http://msdn.microsoft.com/en-GB/library/ms190368(v=sql.110).aspx

DECLARE @TABLE TABLE
(
    Data VARCHAR(3)
)

SET ANSI_WARNINGS OFF

INSERT INTO @TABLE 
VALUES('Hello World')

SELECT * FROM @TABLE

SET ANSI_WARNINGS ON

INSERT INTO @TABLE 
VALUES('Goodbye World')

SELECT * FROM @TABLE
6 голосов
/ 13 января 2009

Лично я хочу, чтобы они потерпели неудачу, а затем посмотрели на данные. Я не верю, что вы когда-нибудь задумывались об автоматическом усечении данных. Вы могли бы фактически нуждаться в увеличении вашего определения поля. Вы не узнаете, если не визуально осмотрите строки, которые могут выйти из строя.

Пример: Мы храним заголовки речи. Предположим, у вас было два заголовка:
Как читать книгу:
Как читать книгу в ванной, не намочив ее

Теперь, если в вашем поле будет 10 символов, оба будут усечены до одной и той же вещи. Кроме того, то, к чему они были усечены, даже не имеет смысла. Оба сказали бы: «Как поступить?» Теперь у вас нет разницы между двумя совершенно разными названиями, и то, что у вас есть, в любом случае неверно. Настройка поля для хранения большего количества символов, безусловно, правильная вещь. Этот пример глуп, но мусор внутри, мусор вне. Если вы урежете имена людей или другие важные данные, у вас в конечном итоге возникнут проблемы, потому что у вас есть мусорные данные. Я видел, как это происходило с нашими речевыми заголовками, с фамилиями, адресами, телефонными номерами и множеством других данных. Если вам нужно усечь данные, скорее всего, вы все равно сохраните бесполезные данные для этой записи. Либо данные нуждаются в корректной очистке (например, удаление () - из номера телефона, если вы предназначены только для хранения номеров) перед импортом в производственные данные, либо поле должно быть больше.

1 голос
/ 12 января 2009

Я не знаю более простого способа, чем выследить их и использовать LEFT(). Я хотел бы знать, если есть, то.

Очевидно, что используя метаданные типа INFORMATION_SCHEMA.COLUMNS, вы можете определить это автоматически и записать сценарий для выполнения LEFT() соответствующей длины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...