CREATE TABLE dbo.CoolPeople(PersonName VARCHAR(20), PrimaryCar VARCHAR(20));
GO
INSERT INTO dbo.CoolPeople(PersonName, PrimaryCar)
VALUES ('Baby', '2006 Subaru Impreza WRX GD');
GO
Машина Baby длиннее, чем 20 символов, поэтому при выполнении оператора INSERT получаем ошибку:
Msg 8152, Level 16, State 30, Line 5
String or binary data would be truncated.
The statement has been terminated.
Это засада, поскольку у нас нет идей относительно того, какое поле вызвало проблемы! Это особенно ужасно, когда вы пытаетесь вставить множество строк.
Чтобы пофиксить ошибку, включите флаг трассировки 460
Флаг трассировки 460 был введен в SQL Server Sevice Pack 2, Cummulative Update 6, и в SQL Server 2017. (Вы можете найти и загрузить последние обновления с SQLServerUpdates.com.) Вы можете включить флаг на уровне запроса, например:
INSERT INTO dbo.CoolPeople(PersonName, PrimaryCar)
VALUES ('Baby', '2006 Subaru Impreza WRX GD')
OPTION (QUERYTRACEON 460);
GO
Теперь, если выполнить запрос, он покажет вам, какой столбец усекается, а также какая строка. В нашем случае мы имеем только одну строку, но в реальной жизни много полезней будет знать, какая строка вызвала ошибку:
Msg 2628, Level 16, State 1, Line 9
String or binary data would be truncated in
table 'StackOverflow2013.dbo.CoolPeople', column 'PrimaryCar'.
Truncated value: '2006 Subaru Impreza '.
Вы можете включить этот флаг трассировки как на уровне запроса (в нашем примере выше), так и на уровне сервера:
DBCC TRACEON(460, -1);
GO
Этот оператор включает его для всех, а не только для вас — поэтому сначала договоритесь со своей командой разработчиков, прежде чем включать его. Это изменит номер ошибки 8152 на 2628 (как показано выше), означающее, что если вы строили обработку ошибок на основании этих номеров, вы сразу получите другое поведение.
Я любитель включения этого флага трассировки на время отладки и изучения, но как только обнаруживаю источник проблем, выключаю его, снова выполнив команду:
DBCC TRACEON(460, -1);
GO
В нашем случае, как только мы идентифицировали избыточную длину машины Baby, необходимо либо изменить название машины, либо изменить тип данных в нашей таблице, чтобы сделать размер столбца больше. Можно также предварительно обрабатывать данные, явно отсекая избыточные символы. Мастерская по разборке данных, если хотите.
Не оставляйте этот флаг включенным
По крайней мере, имеется связанный с этим один баг в SQL Server 2017 CU13: табличные переменные будут выбрасывать ошибки, говорящие, что их содержимое усекается, даже если никакие данные не вставляются в них.
Вот простой скрипт, чтобы проверить, пофиксили ли это поведение:
CREATE OR ALTER PROC dbo.Repro @BigString VARCHAR(8000) AS
BEGIN
DECLARE @Table TABLE ( SmallString VARCHAR(128) )
IF ( 1 = 0 )
/* Это никогда не выполняется */
INSERT INTO @Table ( SmallString )
VALUES(@BigString)
OPTION (QUERYTRACEON 460)
END
GO
DECLARE @BigString VARCHAR(8000) = REPLICATE('blah',100)
EXEC dbo.Repro @BigString
GO
SQL Server 2017 CU13 всё еще сообщает об усечении строки, даже если строка не вставляется:
Переключение с табличной переменной на временную таблицу приводит к ожидаемому поведению:
Это замечательный пример, почему не следует использовать флаги трассировки по умолчанию. Конечно, они могут пофиксить проблемы, но они также могу вызвать непредсказуемое или нежелательное поведение. (И, вообще, я не фанат табличных переменных.)
7 / 7 / 2 Регистрация: 09.02.2014 Сообщений: 91 |
|
1 |
|
Ошибка при добавлении новых данных в бд06.08.2014, 13:21. Показов 7527. Ответов 15
Доброго времени суток! При добавлении данных в столбец путь(выбирается фото, путь считывается в textbox, а из textbox в запросе этот textbox отправляется в столбец) выскакивает ошибка:String or binary data would be truncated. The statement has been terminated. При небольшом количестве символов все ок, а если путь длинный, то ошибка. В конструкторе бд даже maxlength 100 поставил — та же песня.
0 |
34 / 34 / 8 Регистрация: 13.06.2014 Сообщений: 509 |
|
06.08.2014, 13:28 |
2 |
vitali36, ну вопросики из за кодировки, а то что с длинным путем не работает это норма я тут тебе не подскажу, напишу только какая у меня ситуация была я делал прогу и в ней кусок кода, чтобы вытаскивать путь от екзешника и собирать конекшн стринг для адо конекшн, там тоже была слишком длинная строка
0 |
7 / 7 / 2 Регистрация: 09.02.2014 Сообщений: 91 |
|
06.08.2014, 13:57 [ТС] |
3 |
Ё-маё) Несколько конекшнов, а потом конкантенация. Не хочется,конечно так извращаться) Вероятно, есть более приемлемые способы. Может кто еще знает. Но все равно,спасибо,оставлю если что это на крайний случай. По поводу кодировки. Как мне для моего textbox ее поменять. Например, чтобы корректно отображалась дата в бд я использовал DateTime.Parse(this.дата_добавленияDateTimePicker.Text)
0 |
34 / 34 / 8 Регистрация: 13.06.2014 Сообщений: 509 |
|
06.08.2014, 14:15 |
4 |
Как мне для моего textbox ее поменять. хз)
0 |
1109 / 847 / 496 Регистрация: 09.04.2014 Сообщений: 2,001 |
|
06.08.2014, 16:08 |
5 |
String or binary data would be truncated. Это значит что поле в базе короче данных, которые вы туда пытаетесь вставить. Установите размер поля в БД на пример на 300. В textbox есть свойство MaxLength, которое не позволяет вводить больше символов, чем его значение. Установите textbox.MaxLength на те же 300
По поводу кодировки. Используйте в базе поля типа nvarchar (данные хранятся в unicode) и проблем не будет
чтобы корректно отображалась дата в бд я использовал DateTime.Parse(this.дата_добавленияDateTimePicker.Text) а чем вас дата_добавленияDateTimePicker.Value не устраивает?
0 |
7 / 7 / 2 Регистрация: 09.02.2014 Сообщений: 91 |
|
07.08.2014, 15:56 [ТС] |
6 |
Поменял в конструкторе бд длину пути maxlength 100 поставил. В текстбоксе стоит максимальная длина. С длиной также ошибка. Я удалил и снова добавил datagridview с полями бд(думал может обновить надо поля) Теперь данные вообще там не отображаются(хотя messagebox говорит что данные добавляются, но потом при запуске пусто) Что это вообще такое? А сегодня еще впридачу sql сервер ошибку 10061 выдает.
0 |
1057 / 864 / 195 Регистрация: 31.03.2010 Сообщений: 2,521 |
|
07.08.2014, 15:57 |
7 |
vitali36, поставьте тип столбца nvarchar(MAX)
0 |
7 / 7 / 2 Регистрация: 09.02.2014 Сообщений: 91 |
|
07.08.2014, 16:17 [ТС] |
8 |
С сервером разобрался. Почему-то он отключился. Тип столбца поставить в sql server или в visual studio в конструкторе? Все, поменял. Спасибо большое, Learx Добавлено через 17 минут
0 |
1057 / 864 / 195 Регистрация: 31.03.2010 Сообщений: 2,521 |
|
07.08.2014, 16:18 |
9 |
vitali36, приведите код где выполняете запрос к БД и создаете привязку данных
0 |
vitali36 7 / 7 / 2 Регистрация: 09.02.2014 Сообщений: 91 |
||||
07.08.2014, 17:02 [ТС] |
10 |
|||
Добавлено через 7 минут
0 |
1057 / 864 / 195 Регистрация: 31.03.2010 Сообщений: 2,521 |
|
07.08.2014, 17:12 |
11 |
попробуйте занести новые данные.
0 |
vitali36 7 / 7 / 2 Регистрация: 09.02.2014 Сообщений: 91 |
||||
07.08.2014, 18:02 [ТС] |
12 |
|||
0 |
nedel 1109 / 847 / 496 Регистрация: 09.04.2014 Сообщений: 2,001 |
||||||||
07.08.2014, 18:14 |
13 |
|||||||
замените на
0 |
7 / 7 / 2 Регистрация: 09.02.2014 Сообщений: 91 |
|
07.08.2014, 18:21 [ТС] |
14 |
nedel, поменял. Все также, как и было. Русские буквы не воспринимает. А почему лучше использовать метод ExecuteNonQuery()?
0 |
Learx 1057 / 864 / 195 Регистрация: 31.03.2010 Сообщений: 2,521 |
||||
07.08.2014, 18:26 |
15 |
|||
Добавлено через 1 минуту Добавлено через 54 секунды
0 |
7 / 7 / 2 Регистрация: 09.02.2014 Сообщений: 91 |
|
07.08.2014, 19:12 [ТС] |
16 |
Learx, переделал, как Вы написали. Теперь пишет, что данные добавлены, но в запись сама не добавляется. Добавлено через 8 минут
0 |
I’m running this SQL statement
exec sp_executesql
N'UPDATE dbo.PricingProfileRuleSetCondition
SET RuleGroup = @p0,
JoinClause = @p1,
ColumnName = @p2,
Operator = @p3,
Value = @p4,
RuleSetId = @p5
WHERE Id = @p6',
N' @p0 int,
@p1 nvarchar(4000),
@p2 nvarchar(4000),
@p3 nvarchar(4000),
@p4 nvarchar(4000),
@p5 bigint,
@p6 bigint'
,
@p0=0,
@p1=N'And',
@p2=N'DMS.Finance.Entities.PartnerAccountTransactionAmountType.EnglishName',
@p3=N'eq',
@p4=N'dsaf',
@p5=4,
@p6=6
and I’m getting
Msg 8152, Level 16, State 2, Line 1
String or binary data would be truncated.
The statement has been terminated.
help,please
Ошибка Microsoft SQL Server: SQL SERVER-Msg 8152, Уровень 16, состояние 14-строковые или двоичные данные будут усечены
Подробности ошибки:
Строковые или двоичные данные будут усечены. Заявление было прекращено.
This error message below occurs when part data is been truncated while loading a table.
Фактическое сообщение об ошибке:
Msg 8152, Level 16, State 14, Line 8
String or binary data would be truncated.
The statement has been terminated.
Решение:
Либо сократите данные, которые усекаются, либо увеличьте длину столбца в таблице, либо используйте инструкции below вверху и внизу инструкции sql insert, которая подавляет ошибку.
SET ANSI_WARNINGS OFF;
-- Insert TSQL here.
SET ANSI_WARNINGS ON;
При использовании Andi_Warnings off ошибка будет подавлена в приведенном выше коде, но мы потеряли часть фактических данных, которые должны были быть у нас в таблице. Поэтому будьте осторожны при работе с такими заданными опциями.
Дополнительная информация ниже:
Используйте ANSI_WARNING OFF с осторожностью, так как иногда важные данные могут быть усечены или потеряны. Также оказывает негативное влияние на производительность оператора insert.
First published on MSDN on Oct 24, 2018
In the recent announcement at Ignite 2018 on the release of SQL Server 2019 CTP 2.0, the new Big Data Clusters , data virtualization, support for UTF-8 , and Intelligent Query Processing were highlights. But we have also previewed work being done to address the infamous error message “String or binary data would be truncated”.
This error condition may happen for example when you implement an ETL between a source and a destination that does not have matching data types and/or length. In this context, the message «String or binary data would be truncated» is one of the most time-consuming troubleshooting processes to engage in, especially in large datasets. You probably know about and voted for this feedback item before.
Let’s see an example of what happens when you insert data into a column whose size is not big enough to store it:
USE [AdventureWorks2016CTP3]
GO
DROP TABLE IF EXISTS [Sales].[SalesOrderHeaderTest]
GO
CREATE TABLE [Sales].[SalesOrderHeaderTest](
[SalesOrderID] [INT] NOT NULL,
[CustomerID] [INT] NOT NULL,
[CreditCardApprovalCode] [nvarchar](13) NULL
)
GO
INSERT INTO [Sales].[SalesOrderHeaderTest]
SELECT [SalesOrderID], [CustomerID], [CreditCardApprovalCode]
FROM [Sales].[SalesOrderHeader]
GO
You receive following error message, which admittedly is not very helpful:
Msg 8152, Level 16, State 30, Line 13
String or binary data would be truncated.
The statement has been terminated.
We heard that. Which is why SQL Server 2019 introduces a new message , with additional context information. For the same operation, the new error message outputs the following:
Msg 2628, Level 16, State 1, Line 14
String or binary data would be truncated in table ‘AdventureWorks2016CTP3.Sales.SalesOrderHeaderTest’, column ‘CreditCardApprovalCode’. Truncated value: ‘1231736Vi8604’.
The statement has been terminated.
Ok, the new error message provides more context, and now I have the resulting truncated value (not the source value). This is simplifying the troubleshooting process, because now I know the truncated value starts with ‘1231736Vi8604′ – that’s 13 characters. And so I can go back to my data source, and locate the source record and its length:
SELECT [SalesOrderID], [CustomerID], [CreditCardApprovalCode], LEN([CreditCardApprovalCode])
FROM [Sales].[SalesOrderHeader]
WHERE CreditCardApprovalCode LIKE ‘1231736Vi8604%’
It’s 14 characters, and in my table definition I have a NVARCHAR(13). Well, I know what I need to do: change my table data type length.
This new message is also backported to SQL Server 2017 CU12 and in SQL Server 2016 SP2 CU6, but not by default. You need to enable trace flag 460 to replace message ID 8152 with 2628, either at the session or server level.
Note that for now, even in SQL Server 2019 CTP 2.0 the same trace flag 460 needs to be enabled. In a future SQL Server 2019 release, message 2628 will replace message 8152 by default.
EDIT (3/29/2019): For SQL Server 2019 CTP 2.4, Message 2628 becomes default under Database Compatibility Level 150. You can use the Database Scoped Configuration VERBOSE_TRUNCATION_WARNINGS to revert to back to Message 8152 as default. You can also use a lower Database Compatibility Level to revert back to Message 8152 as default.
Is there a limit to how much of my truncated string this error can return?
Let’s run a small test inserting a 123 character string into a VARCHAR(120):
CREATE TABLE myTable (myString VARCHAR(120));
GO
INSERT INTO myTable
VALUES (‘Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.’)
GO
Although my string gets truncated at 120 characters, the offending value that is shown is truncated to the first 100 characters:
Msg 2628, Level 16, State 1, Line 30
String or binary data would be truncated in table ‘AdventureWorks2016CTP3.dbo.myTable’, column ‘myString’. Truncated value: ‘Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore ‘.
Still plenty to find offending values in most data sources.
Pedro Lopes ( @SQLPedro ) – Senior Program Manager