Ошибка the statement has been terminated

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 поставил — та же песня.
И вторая проблема: Если в textbox вбиваю данные на русском языке, то в datagridview и на sql server вместо символов — вопросики(?????). 1 вопрос — 1 символ строки. Подскажите, пожалуйста, в чем проблемы?



0



34 / 34 / 8

Регистрация: 13.06.2014

Сообщений: 509

06.08.2014, 13:28

2

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

я делал прогу и в ней кусок кода, чтобы вытаскивать путь от екзешника и собирать конекшн стринг для адо конекшн, там тоже была слишком длинная строка
мне пришлось создать 2 дополнительных элемента АДо конекшн, чтобы из их полей собирать все в одну строку
поле из первого коннекта+путь к файлу+поле из второго коннекта
возможно есть более продуктивные методы, но я делал так)
и возможно тебе тоже придется обходные пути придумывать



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

Цитата
Сообщение от vitali36
Посмотреть сообщение

Как мне для моего textbox ее поменять.

хз)



0



1109 / 847 / 496

Регистрация: 09.04.2014

Сообщений: 2,001

06.08.2014, 16:08

5

Цитата
Сообщение от vitali36
Посмотреть сообщение

String or binary data would be truncated.

Это значит что поле в базе короче данных, которые вы туда пытаетесь вставить. Установите размер поля в БД на пример на 300. В textbox есть свойство MaxLength, которое не позволяет вводить больше символов, чем его значение. Установите textbox.MaxLength на те же 300

Цитата
Сообщение от vitali36
Посмотреть сообщение

По поводу кодировки.

Используйте в базе поля типа nvarchar (данные хранятся в unicode) и проблем не будет

Цитата
Сообщение от vitali36
Посмотреть сообщение

чтобы корректно отображалась дата в бд я использовал 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 минут
С кодировкой все равно проблема. nvachar поставил. И почему в datagridview перестали данные отображаться после того, как я удалил эту datagridview и заново поставил.



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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 string constring = @"Data Source=(LocalDB)v11.0;AttachDbFilename=C:my_baseMainProjectMainProjectMyBaseOfPhoto.mdf;Integrated Security=True";
            string loadAllDataQuery = "select * from MyBaseOfPhoto.MyTable ; ";
            SqlConnection MySqlConn = new SqlConnection(constring);
            SqlCommand lOadDataCommand = new SqlCommand(loadAllDataQuery, MySqlConn);
            try
            {
                SqlDataAdapter sda = new SqlDataAdapter();
                sda.SelectCommand = loadAllDataQuery;
                DataTable dtDataset = new DataTable();
                sda.Fill(dtDataset);
                BindingSource bSource = new BindingSource();
                bSource.DataSource = dtDataset;
                myTableDataGridView.DataSource = bSource;
                sda.Update(dtDataset);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
 
            }

Добавлено через 7 минут
Нашел ошибку. Переменные криво назвал. Из-за этого описался. В строке sda.SelectCommand вместо loadAllDataQuery нужно было написать lOadDataCommand. И еще имя базы не надо было указыать, а только имя таблицы. Осталась проблема с кодировкой. В поле стоит nvachar. А все равно ?????



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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  string constring = @"Data Source=(LocalDB)v11.0;AttachDbFilename=C:my_baseMainProjectMainProjectMyBaseOfPhoto.mdf;Integrated Security=True";
            string InsertQuery = "insert into MyTable (Номер_фото,Путь,Тематика,Дата_добавления) values('" + this.номер_фотоTextBox.Text + "','" + this.путьTextBox.Text + "','" + this.тематикаTextBox.Text + "','" + DateTime.Parse(this.дата_добавленияDateTimePicker.Text) + "') ;";
            SqlConnection MySqlConn = new SqlConnection(constring);
            SqlCommand InsertCommand = new SqlCommand(InsertQuery, MySqlConn);
            SqlDataReader MyRead;
            try
            {
                MySqlConn.Open();
                MyRead = InsertCommand.ExecuteReader();
                MessageBox.Show("Данные добавлены");
                while (MyRead.Read())
                {
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }



0



nedel

1109 / 847 / 496

Регистрация: 09.04.2014

Сообщений: 2,001

07.08.2014, 18:14

13

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SqlDataReader MyRead;
            try
            {
                MySqlConn.Open();
                MyRead = InsertCommand.ExecuteReader();
                MessageBox.Show("Данные добавлены");
                while (MyRead.Read())
                {
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

замените на

C#
1
2
3
4
5
6
7
8
9
10
            try
            {
                MySqlConn.Open();
                InsertCommand.ExecuteNonQuery();
                MessageBox.Show("Данные добавлены");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }



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

C#
1
2
3
4
5
6
7
8
9
string InsertQuery = @"insert into MyTable (Номер_фото,Путь,Тематика,Дата_добавления)
  values(@f_num,@path,@theme,@dt)";
 
            SqlConnection MySqlConn = new SqlConnection(constring);
            SqlCommand InsertCommand = new SqlCommand(InsertQuery, MySqlConn);
InsertCommand.Parameters.Add("@f_num", SqlDbType.Int).Value = this.номер_фотоTextBox.Text;
InsertCommand.Parameters.Add("@path", SqlDbType.NVarChar).Value = this.путьTextBox.Text;
InsertCommand.Parameters.Add("@theme", SqlDbType.NVarChar).Value = this.тематикаTextBox.Text;
InsertCommand.Parameters.Add("@dt", SqlDbType.Date).Value = this.дата_добавленияDateTimePicker.Value;

Добавлено через 1 минуту
vitali36, ExecuteReader служит для получения данных, а есл небходимо выполнить одну команду, то следует использовать метод ExecuteNonQuery()

Добавлено через 54 секунды
а вы новые данные занесли?
и да! используйте во всех текстовых столбцах тип nvarchar !!!!



0



7 / 7 / 2

Регистрация: 09.02.2014

Сообщений: 91

07.08.2014, 19:12

 [ТС]

16

Learx, переделал, как Вы написали. Теперь пишет, что данные добавлены, но в запись сама не добавляется.

Добавлено через 8 минут
Все, теперь все Ок. После записей забыл добавить ExecuteNonQuery(). Теперь и с кодировкой все ок, и в дате добавления даже время отображается. Спасибо, Огромное, Learx!



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

Понравилась статья? Поделить с друзьями:
  • Ошибка there is no more
  • Ошибка the sql statement could not by executed
  • Ошибка there is no attribute width
  • Ошибка the specified video mode is not supported
  • Ошибка there is no attribute type