Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
mabanza
Member

Откуда:
Сообщений: 194
Привет.
При сохранении поля в MS SQL 2012, выбрасывается ошибка:

String or binary data would be truncated. The statement has been terminated

Ее происхождение очевидно: длина данных (строки), которые вставляются, больше чем длина поля в БД.
Не очевидно только одно: а зачем такая проверка? В Первэзиве все проходит хорошо, поле обрезается, но сохраняется в БД. Как такое устроить в MS SQL, мне эта проверка не нужна?

Спасибо
20 дек 13, 02:26    [15320950]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
sdet
Member

Откуда:
Сообщений: 463
mabanza
Привет.
При сохранении поля в MS SQL 2012, выбрасывается ошибка:

String or binary data would be truncated. The statement has been terminated

Ее происхождение очевидно: длина данных (строки), которые вставляются, больше чем длина поля в БД.
Не очевидно только одно: а зачем такая проверка? В Первэзиве все проходит хорошо, поле обрезается, но сохраняется в БД. Как такое устроить в MS SQL, мне эта проверка не нужна?

Спасибо

Или вы увеличиваете длину поля, или уменьшаете строку до insert. Странно, что вам не очевидно, что вы можете потерять данные даже не узнав об этом
20 дек 13, 02:47    [15320964]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
mabanza,

не вполне уверен но вроде вот такое должно на это влиять
SET ARITHABORT ON
по крайней мере у меня поначалу хвосты сами отрезались
а потом понадобилось вот такое добавить и полезли аналогичные ошибки с truncate
пришлось строже валидацию везде прописывать
20 дек 13, 04:45    [15321064]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
mabanza
Member

Откуда:
Сообщений: 194
Я не теряю данные, если есть ограничение в доменной логике. Я пишу валидаторы, какие нужны по бизнес правилам, но не то, что диктует мне разработчик базы данных. Если завтра он изменит длину полей, я не должен изменять валидацию, перебилдивать, деплоить и всякая такая штука. Только если изменились бизнес-правила.

Его длины полей - это его дело, а микрософт ставит меня в зависимость от среды, которая может иметь, а может и не иметь каких-либо огрничений.
Странно, что вы считаете нормальной такую сильную связь клентской и серверной части.
Это называется strong coupling и это хреновая практика. Тот же Pervasive более разумно поступает, оставляя программисту решать, считать ли длины полей частью бизнес логики или нет.
Но это все переходит потихоньку в религиозные войны. А по-существу, я думаю это фикснуть в ORM mapper путем простого обрезания полей на основе метаданных из базы. Чтоб подстроиться под микрософт. Другого выхода, похоже, нет.
Спасибо.
20 дек 13, 04:54    [15321066]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4237
mabanza
Другого выхода, похоже, нет.
Даже если вас съели, у вас есть по меньшей мере два выхода.
SET ANSI_WARNINGS
declare @t table(s varchar(5))

insert into @t values ('Barak Obama')

select * from @t

go

declare @t table(s varchar(5))

set ANSI_WARNINGS  OFF

insert into @t values ('Vladimir Putin')

select * from @t

Только придумайте заранее, как будете объяснять пользователям, что данные которые они вбивали день/неделю/месяц/... сохранились только частично и нужно их перепроверить.
mabanza
Я пишу валидаторы, какие нужны по бизнес правилам, но не то, что диктует мне разработчик базы данных.
А вот этот вопрос нужно решать с разработчиком или его начальником.

ЗЫ: можно вообще всё хранить в varchar(max) - типы данных придумали перестраховщики.
20 дек 13, 05:18    [15321073]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
Jaffar
Member

Откуда:
Сообщений: 633
==> Странно, что вы считаете нормальной такую сильную связь клентской и серверной части.

А если в базе данных не будет таблицы в которую вы пытаетесь вставить - субд тоже молча "проглатывать" должна?
Ведь вас не волнует что там и как с базой - вы запрос отправили - а дальше проблемы базы, так?

Если хотите чтобы все было совсем хорошо - то можно сделать пред_проверку длинны поля, посмотреть в системном представлении
sys.columns

длинну поля и если длинна реально вбитых данных больше - спросить пользователя что делать?
20 дек 13, 06:53    [15321120]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4237
Jaffar
Если хотите чтобы все было совсем хорошо - то можно сделать пред_проверку длинны поля, посмотреть в системном представлении
sys.columns


длинну поля и если длинна реально вбитых данных больше - спросить пользователя что делать?
только придется давать пользователю права на SELECT на этом системном представлении.
20 дек 13, 07:34    [15321148]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31328
mabanza
Странно, что вы считаете нормальной такую сильную связь клентской и серверной части
Не нужна связь, не делайте. Можно писать в базу, обрезая до нужной длинны в замом запросе сохранения данных, командой LEFT.
mabanza
Это называется strong coupling и это хреновая практика.

А вас не коробит эта хреновая практика "strong coupling" в вашем коде сервера приложений?

Или у вас всё сделано так, что любому методу или свойству класса можно передать любой объект, и приложение (или компилятор) не ругнётся, а кое как обрежет, приведёт тип, в крайнем случае запишет дефолтное значение? Допустим, это у вас нормальная практика в коде приложения? :
byte b = 1234567;
20 дек 13, 09:02    [15321307]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2394
Почему производитель устанавливает на машинах ремни безопасности? Мне они только мешают. Зачем такая сильная связь?
20 дек 13, 10:00    [15321529]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Ruuu,


ну если вы так боитесь что пользователь узнает длину поля в таблице - сделайте скалярную функцию, которая по имени табл. и поля возвращает длину.

я не знаю нужны ли особые права на sys - можно сделать execute as dbo
20 дек 13, 12:44    [15322551]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
o-o
Guest
Ruuu
Jaffar
Если хотите чтобы все было совсем хорошо - то можно сделать пред_проверку длинны поля, посмотреть в системном представлении
sys.columns


длинну поля и если длинна реально вбитых данных больше - спросить пользователя что делать?
только придется давать пользователю права на SELECT на этом системном представлении.


если у юзера есть INSERT на таблицу,
он увидит колонки этой таблицы в sys.columns
без всякой выдачи специального "SELECT на этом системном представлении"
20 дек 13, 13:03    [15322685]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54120
Коллеги, а как увидеть, где ошибка свалилась, на какой таблице-колонке?

Спасибо
24 апр 17, 09:53    [20427813]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
o-o
Guest
может, напишете хоть, когда вываливается ошибка?
как можно не знать, на какой таблице валится,
вы во все таблицы базы что ли одно и то же льете и эту ошибку получаете?
---
если это какой-то insert..select, сделайте selech max(len()) каждому бинарному/текстовому полю источника
и посмотрите, где есть превышение размера поля приемника
24 апр 17, 10:01    [20427846]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54120
o-o,

спасибо, как искать, я в курсе
мне интересно, есть ли возможность получить это автоматом, не затрачивая время разраба
24 апр 17, 10:11    [20427893]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
andreymx
o-o,

спасибо, как искать, я в курсе
мне интересно, есть ли возможность получить это автоматом, не затрачивая время разраба

контролировать вставку?
24 апр 17, 10:26    [20427959]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54120
TaPaK
andreymx
o-o,

спасибо, как искать, я в курсе
мне интересно, есть ли возможность получить это автоматом, не затрачивая время разраба

контролировать вставку?
можно
но я бы хотел запросить у системы, на чем она валится
24 апр 17, 10:28    [20427971]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
andreymx
TaPaK
пропущено...

контролировать вставку?
можно
но я бы хотел запросить у системы, на чем она валится

а у ясеня запросить?
спрашивайте перед вставкой? проверяйте всю вставку... что значить запросить у сиситемы
24 апр 17, 10:33    [20427992]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54120
TaPaK,

не хочу срач разводить на тему - почему система не говорит, в каком поле валится ошибка
Спасибо
24 апр 17, 10:42    [20428026]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка: String or binary data would be truncated. Как фикснуть?  [new]
НеРоботъ
Guest
Oracle (не так давно) научился


CREATE TABLE A(A NUMBER(1), b VARCHAR2(1));

insert into a(b) select rownum from dual connect by rownum < 12; 

ORA-12899: значение для столбца "Имя_Схемы"."A"."B" слишком велико (фактическое: 2, максимальное: 1)
24 апр 17, 15:13    [20429603]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить