What does sqlcode -302 means?
Where do i get the sqlcode definitions?
Please advice
Thanks,
asked Mar 8, 2012 at 21:36
You can find the codes in the DB2 Information Center. Here’s a definition of the -302
from the z/OS Information Center:
THE VALUE OF INPUT VARIABLE OR PARAMETER NUMBER position-number IS
INVALID OR TOO LARGE FOR THE TARGET COLUMN OR THE TARGET VALUE
On Linux/Unix/Windows DB2, you’ll look under SQL Messages to find your error message. If the code is positive, you’ll look for SQLxxxxW
, if it’s negative, you’ll look for SQLxxxxN
, where xxxx is the code you’re looking up.
answered Mar 8, 2012 at 23:08
bhambybhamby
15k1 gold badge45 silver badges65 bronze badges
2
To get the definition of the SQL codes, the easiest way is to use db2 cli!
at the unix or dos command prompt, just type
db2 "? SQL302"
this will give you the required explanation of the particular SQL code that you normally see in the java exception or your db2 sql output
hope this helped.
answered Jul 2, 2014 at 8:25
FaisalFaisal
4425 silver badges13 bronze badges
3
As a general point when using a search engine to search for SQL codes make sure you put the sqlcode e.g. -302 in quote marks — like «-302» otherwise the search engine will exclude all search results including the text 302, since the — sign is used to exclude results.
answered Aug 12, 2014 at 10:35
Problem
When you export crawled, analyzed, or searched documents to a relational database, the export fails and the message “DB2 SQL error: SQLCODE=-302, SQLSTATE=22001” is written to the system log in the ES_NODE_ROOT/logs directory.
Cause
The length of an exported field or facet value is longer than the length of the corresponding column in the database table.
Resolving The Problem
You can resolve this problem in one of the following ways:
- Configure IBM Cognos Content Analytics to truncate any exported field or facet value that is longer than the length of the of the corresponding column in the database table. In your database mapping file, set the value of the policy property to truncate.
- Restriction: IBM Cognos Content Analytics does not truncate binary content. If your binary content exceeds 1 MB, you must recreate the database table to solve this problem.
- Recreate the database table so that its columns are large enough to contain the exported field or facet values.
To recreate the database table:
- Determine which table needs to be recreated by checking the SQL error message in the export audit log in the ES_NODE_ROOT/logs/audit directory. For example, the following message indicates that the DEVICEAVAILABILITY column from the ESADMIN.DEVICEAVAILABILITY table is not long enough to store the corresponding field values.11/27/09 06:05:06.922 GMT+09:00 [Error] [ES_INFO_GENERAL_AUDIT_INFO] [] []
serverx.ibm.com:4368:120:X’0′:bd.java:com.ibm.db2.jcc.am.bd.a:668
FFQX0717I 251658517
com.ibm.db2.jcc.am.co: DB2 SQL Error: SQLCODE=-302, SQLSTATE=22001, SQLERRMC=null,
DRIVER=3.57.82
com.ibm.db2.jcc.am.co: DB2 SQL Error: SQLCODE=-302, SQLSTATE=22001, SQLERRMC=null,
DRIVER=3.57.82
at com.ibm.db2.jcc.am.bd.a(bd.java:668)
…….
at com.ibm.db2.jcc.am.lm.executeQuery(lm.java:628)
at com.ibm.es.oze.export.rdb.query.dml.Search.execute(Search.java:82)
at java.lang.Thread.run(Thread.java:736)11/27/09 06:05:06.922 GMT+09:00 [Warning] [ES_INFO_GENERAL_AUDIT_INFO] [] []
serverx.ibm.com:4368:120:X’0′:DB2Utils.java:com.ibm.es.oze.export.rdb.utils.DB2Utils.d
LogSQLException:157
FFQX0717I SELECT «ID»,»DEVICEAVAILABILITY» FROM «ESADMIN».»DEVICEAVAILABILITY» WHERE
«DEVICEAVAILABILITY»=? - In your database mapping file, increase the length of the column in the appropriate table definition. In our example, the database mapping file contains the following definition for the DEVICEAVAILABILITY column in the ESADMIN.DEVICEAVAILABILITY table:<table schema=»ESADMIN» name=»DEVICEAVAILABILITY» type=»document»>
<column name=»ID» key=»true» function=»id» type=»INTEGER»/>
<column name=»DEVICEAVAILABILITY» key=»false» type=»CHAR(4)»>
<value source=»field» name=»deviceavailability»/>
</column>
</table>Increase the length of the DEVICEAVAILABILITY column by modifying the size that is specified for the type attribute. For example, change type=»CHAR(4)» to type=»CHAR(6)». - After you update the column definition, drop the table or recreate the database.
- Reexport your documents.
If you receive this error for a column that contains binary content, ensure that you specify a size for the BLOB column in its table definition. For example, change
type=“BLOB»
to
type=“BLOB(10M)»
. If no size is specified, DB2 by default creates a column that can store 1 MB.
Also ensure that you specify a column size that is large enough to store your binary content data. For example, if you crawl files that are no more than 5 MB, set the BLOB column size to 5 MB. If you do not know the size of the data, you can ensure that the column is large enough by specifying 32 MB as the column size because the maximum page size that can be crawled is 32 MB. However, specifying 32 MB as the column size might unnecessarily consume database server resources if most of the crawled data is less than 32 MB.
[{«Product»:{«code»:»SS5RWK»,»label»:»Content Analytics with Enterprise Search»},»Business Unit»:{«code»:»BU053″,»label»:»Cloud & Data Platform»},»Component»:»—«,»Platform»:[{«code»:»PF002″,»label»:»AIX»},{«code»:»PF016″,»label»:»Linux»},{«code»:»PF033″,»label»:»Windows»}],»Version»:»2.1″,»Edition»:»»,»Line of Business»:{«code»:»LOB10″,»label»:»Data and AI»}}]
What does sqlcode -302 means?
Where do i get the sqlcode definitions?
Please advice
Thanks,
asked Mar 8, 2012 at 21:36
You can find the codes in the DB2 Information Center. Here’s a definition of the -302
from the z/OS Information Center:
THE VALUE OF INPUT VARIABLE OR PARAMETER NUMBER position-number IS
INVALID OR TOO LARGE FOR THE TARGET COLUMN OR THE TARGET VALUE
On Linux/Unix/Windows DB2, you’ll look under SQL Messages to find your error message. If the code is positive, you’ll look for SQLxxxxW
, if it’s negative, you’ll look for SQLxxxxN
, where xxxx is the code you’re looking up.
answered Mar 8, 2012 at 23:08
bhambybhamby
15k1 gold badge45 silver badges65 bronze badges
2
To get the definition of the SQL codes, the easiest way is to use db2 cli!
at the unix or dos command prompt, just type
db2 "? SQL302"
this will give you the required explanation of the particular SQL code that you normally see in the java exception or your db2 sql output
hope this helped.
answered Jul 2, 2014 at 8:25
FaisalFaisal
4425 silver badges13 bronze badges
3
As a general point when using a search engine to search for SQL codes make sure you put the sqlcode e.g. -302 in quote marks — like «-302» otherwise the search engine will exclude all search results including the text 302, since the — sign is used to exclude results.
answered Aug 12, 2014 at 10:35
Содержание
- SQL-Ex blog
- Как исправить ошибку «Символьные или двоичные данные могут быть усечены»
- Чтобы пофиксить ошибку, включите флаг трассировки 460
- Не оставляйте этот флаг включенным
- Обратные ссылки
- Комментарии
- String or binary data would be truncated sqlstate 22001 error 8152
- Вопрос
- Ответы
- Все ответы
SQL-Ex blog
Новости сайта «Упражнения SQL», статьи и переводы
Как исправить ошибку «Символьные или двоичные данные могут быть усечены»
Сначала давайте посмотрим на ошибку: создадим таблицу с небольшими полями, а затем попытаемся вставить больше данных, чем они могут вместить.
Машина Baby длиннее, чем 20 символов, поэтому при выполнении оператора INSERT получаем ошибку:
Это засада, поскольку у нас нет идей относительно того, какое поле вызвало проблемы! Это особенно ужасно, когда вы пытаетесь вставить множество строк.
Чтобы пофиксить ошибку, включите флаг трассировки 460
Флаг трассировки 460 был введен в SQL Server Sevice Pack 2, Cummulative Update 6, и в SQL Server 2017. (Вы можете найти и загрузить последние обновления с SQLServerUpdates.com.) Вы можете включить флаг на уровне запроса, например:
Теперь, если выполнить запрос, он покажет вам, какой столбец усекается, а также какая строка. В нашем случае мы имеем только одну строку, но в реальной жизни много полезней будет знать, какая строка вызвала ошибку:
Вы можете включить этот флаг трассировки как на уровне запроса (в нашем примере выше), так и на уровне сервера:
Этот оператор включает его для всех, а не только для вас — поэтому сначала договоритесь со своей командой разработчиков, прежде чем включать его. Это изменит номер ошибки 8152 на 2628 (как показано выше), означающее, что если вы строили обработку ошибок на основании этих номеров, вы сразу получите другое поведение.
Я любитель включения этого флага трассировки на время отладки и изучения, но как только обнаруживаю источник проблем, выключаю его, снова выполнив команду:
В нашем случае, как только мы идентифицировали избыточную длину машины Baby, необходимо либо изменить название машины, либо изменить тип данных в нашей таблице, чтобы сделать размер столбца больше. Можно также предварительно обрабатывать данные, явно отсекая избыточные символы. Мастерская по разборке данных, если хотите.
Не оставляйте этот флаг включенным
По крайней мере, имеется связанный с этим один баг в SQL Server 2017 CU13: табличные переменные будут выбрасывать ошибки, говорящие, что их содержимое усекается, даже если никакие данные не вставляются в них.
Вот простой скрипт, чтобы проверить, пофиксили ли это поведение:
SQL Server 2017 CU13 всё еще сообщает об усечении строки, даже если строка не вставляется:
Переключение с табличной переменной на временную таблицу приводит к ожидаемому поведению:
Это замечательный пример, почему не следует использовать флаги трассировки по умолчанию. Конечно, они могут пофиксить проблемы, но они также могу вызвать непредсказуемое или нежелательное поведение. (И, вообще, я не фанат табличных переменных.)
Обратные ссылки
Нет обратных ссылок
Комментарии
Показывать комментарии Как список | Древовидной структурой
Автор не разрешил комментировать эту запись
Источник
String or binary data would be truncated sqlstate 22001 error 8152
Вопрос
Здравствуйте, у меня на SCCM 2012 SP1 возникает следующая ошибка
*** [22001][8152][Microsoft][SQL Server Native Client 11.0][SQL Server]String or binary data would be truncated. : dINSTALLED_SOFTWARE_DATA
Как я понял? на SCCM сервер приходит отчет об инвентаризации програмного обеспечения, и сервер пытается эти данные записать в таблицу dINSTALLED_SOFTWARE_DATA на сиквел сервере. Но то ли в этом отчете есть длинные строчки, то ли целиком файл для sql большой, и сиквел не принимает данные от SCCM сервера
Я запустил на SQL сервере profiler, но он выдает ту же самую ошибку String or binary data would be truncated. Но что имено нужно обрезать, не говорит.
Можно ли узнать, что конкретно не нравится сиквелу во входящих данных?
Я в профайлере включил, в дополнение к стандартным данным, вывод всех ошибок.
Ответы
Для будущих поколений:
Проблема возникает при записи в таблицу INSTALLED_SOFTWARE_HIST, чье поле ServicePack00 имеет формат nvarchar(8), в то время в таблице, откуда копируются данные — INSTALLED_SOFTWARE_DATA — формат этого поля nvarchar(255).
Простое решение — это расширить проблемное поле до nvarchar(255), но без указки инженера Microsoft это переводит базу в состояние unsupported.
Проблема на самом деле заключается еще и в том, что в идеале в это поле никогда не должны писаться данные длиннее 1 символа. Если проверить содержимое этого поля после инвентаризации чистой машины, то там будет «1» в случае версии Service Pack 1. Однако в случае кастомных заливок в данных инвентаризации появляются 2 инстанса операционной системы, одна нормальная, вторая же содержит в этом поле «Service Pack 1» — 14 символов.
Источник появления второго инстанса ОС при инвентаризации WMI-класса Installed_Software пока неизвестен, скорее всего это какое-то расхождение в 32- и 64-хбитных ветках реестра HKLMSoftwareMicrosoftWindows NTCurrentVersion.
Правильное решение в этом случае: перезалить машину чистой проверенной заливкой или отключить инвентаризацию этого класса.
Тест машины на «кривость» — в консоли PS от имени администратора при установленном клиенте запустить: gwmi -namespace rootcimv2sms -query «select * from sms_installedsoftware
where Servicepack<>»»
Если выдается 1 инстанс — все хорошо, если два — машину стоит перезалить.
- Предложено в качестве ответа Pavel Yurenev Microsoft employee 9 октября 2013 г. 14:49
- Помечено в качестве ответа Иван Проданов Microsoft contingent staff, Moderator 10 октября 2013 г. 4:57
нужно включить в Profiler отображение SP: STMTStarting ещё.
так как SQL: StmtStarting показывает только выполнение хранимой процедуры (например, dbo.dInstalled_Software_Data или dbo.pInstalled_Software_Data), а процедура, как оказалось, пишет не в одну таблицу, а в несколько разных, и SP: STMTStarting, как раз, показывает, какая таблица не может принять данные (в моем случае, это оказалась совершенно левая таблица).
Правда, не удалось разобраться, как узнать, какое поле при этом нужно увеличивать. Пришлось увеличить все nvarchar. Благо полей оказалось не так много.
- Помечено в качестве ответа Иван Проданов Microsoft contingent staff, Moderator 28 мая 2013 г. 14:15
Все ответы
Достаточно в профайлере добавить 2 события:
SQL: BatchStarting и Exception
Msg 8152, Level 16, State 14, Line 1 String or binary data would be truncated.
The statement has been terminated.
Вот этот SQL:BatchStarting содержит данные вида
exec dbo.dINSTALLED_SOFTWARE_DATA 4,16777259,’05/27/2013 10:05:27′,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,N’‘,NULL,N’Microsoft Visual C++ 2008 Redistributable — x86 9.0.30729.4148′,N’9.0.30729.4148′,NULL,NULL,NULL,N’<1f1c2dfc-2d24-3e06-bcb8-725134adf989>‘,NULL,NULL,N’MsiExec.exe /X<1f1c2dfc-2d24-3e06-bcb8-725134adf989>‘,NULL,NULL,NULL exec dbo.dINSTALLED_SOFTWARE_DATA 4,16777259,’05/27/2013 10:05:27′,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,N’‘,NULL,N’Microsoft Visual C++ 2010 x86 Redistributable — 10.0.30319′,N’10.0.30319′,NULL,NULL,NULL,N’<196bb40d-1578-3d01-b289-befc77a11a1e>‘,NULL,NULL,N’MsiExec.exe /X<196bb40d-1578-3d01-b289-befc77a11a1e>‘,NULL,NULL,NULL exec dbo.dINSTALLED_SOFTWARE_DATA 4,16777259,’05/27/2013 10:05:27′,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,N’<6b1a624c-dedd-4728-8f85-04f648ae1262>‘,N’1′,N’КОМПАС-3D V13′,N’13.0.2′,NULL,NULL,NULL,N’‘,NULL,NULL,N’MsiExec.exe /I‘,NULL,NULL,NULL
и таких данных несколько экранов. Просто я не совсем в курсе этой ошибки. Она значит, что значение в каком-то столбце превышает допустимую длину переменной, или это может значить, что стоит null, а null запрещен, или несовпадает формат даты времени, или вот эти несколько страниц данных нельзя запихивать в сиквел одновременно?
По поводу первого, скорее всего нет, так как я смотрел, самая большая строчка 180 символов, а переменная nvarchar(255).
По поводу остального, не знаю как проверить.
Да, в одной такой записи, после exec.dbo стоят и другие таблицы из той же базы. И exeption звучит имено так
String or binary data would be truncated.
А про номер ошибки я могу узнать только из логов SCCM. Вряд ли он сам знает, что это за ошибка. Скорее всего ему эти данные дает SQL. А вот где они записаны, не понятно. В тех логах которые я включил, про 8152 ничего нет.
После этого exeption идут другие, так как запись в эту таблицу (dINSTALLED_SOFTWARE_DATA) не произошла, начинают сыпаться ошибки про таблицу содержащую суммарные данные и т.д. (Там кстати ошибка вполне конкретная: Cannot insert the value NULL into column ‘RevisionID’, table ‘CM_OPT.dbo.INSTALLED_SOFTWARE_HIST’; column does not allow nulls. INSERT fails.) Но это из-за того, что не произошла вставка первоночальных данных.
но там 15 столбцов, какой именно столбец не подходит?
И как я понял нельзя руками менять длинну переменной?
но там 15 столбцов, какой именно столбец не подходит?
И как я понял нельзя руками менять длинну переменной?
1) какой столбец вам придётся определить самостоятельно, проанализировав входные данные и размерность полей таблицы
2) что вы имеете в виду?
1) данные я проанализировал, они меньше длинны переменной. Ну, насколько это возможно, там несколько мегабайт данных, может быть что-то и пропустил.
А нет ли возможности определить это автоматически?
2) я могу в таблице выделить любой столбец, нажать изменить и поменять тип переменной, нпример, вместо nvarchar(255) поставить nvarchar(511). Но где-то было написано, что так лучше не делать.
1) данные я проанализировал, они меньше длинны переменной. Ну, насколько это возможно, там несколько мегабайт данных, может быть что-то и пропустил.
А нет ли возможности определить это автоматически?
2) я могу в таблице выделить любой столбец, нажать изменить и поменять тип переменной, нпример, вместо nvarchar(255) поставить nvarchar(511). Но где-то было написано, что так лучше не делать.
ошибка, которую вы получаете связана с размером полей, а не переменных.
изменение размерности поля в таблице — это штатная ситуация
Ткните, пожалуйста, где можно почитать про изменение полей в таблице.
Если нажать кнопку изменить на столбце, то я вижу название столбца, его data type, и может быть он null или нет.
Data type для столбца я изменить не могу, так как в этом случае будет пересоздана вся таблица, а в её свойствах запрещено пересоздание.
Altering a Column Definition
- A. Changing the data type of a column
- B. Changing the size of a column
Спасибо, но не помогло. Ошибка осталась.
Да, действительно, ошибка осталась, но блоков данных стало приниматься больше. То есть SCCM передает данные блоками, и раньше сиквел падал на третьем блоке, а теперь на седьмом.
Но это как иголку в стоге сена 🙁 несколько сотен баз и половина полей в них не хочет увеличиваться.
Как я понял раньше (до 2012 версии) сиквел посылал конкретные сообщения в SCCM — вот этот столбец слишком узкий, а тот, в свою очередь, посылал сиквелу alter этот столбец. A теперь безликая ошибка и соответственно автоматически ситуацию не исправить.
Про set ansi_warnings
насколько я понял, это относится к INSERT и UPDATE. А в моем случае EXEC.
насколько я понял, это относится к INSERT и UPDATE. А в моем случае EXEC.
Сам по себе exec ничего не вставляет, вставка осуществляется через команду INSERT, поэтому вам достаточно в процедуру добавить эту настройку и все вставки пройдут без ошибок, НО(!) имейте в виду, что вы потеряете часть данных т.к. они усекутся под размер ваших полей.
И всё-таки не думаю, что так уж сложно найти в какое поле не могут быть записаны данные, профайлер в руки и несколько минут вашего времени должны помочь найти причину!
вот, я и не пойму как это сделать. Несколько сот классов инвентаризации. Можно по очереди включать их, потом дожидаться, когда на всех клиентах пройдет инвентаризация и проверять, что нет ошибок. В один блок данных попадает около трех таблиц, по 10-15 полей в каждой. это несколько недель, а не минут.
А если потом появится новый клиент со специфическим ПО или драйвером и нужно заново проверять все триста полей.
Что-то тут не так.
Спасибо, будем искать специалиста.
Но всё равно спасибо за помощь.
нужно включить в Profiler отображение SP: STMTStarting ещё.
так как SQL: StmtStarting показывает только выполнение хранимой процедуры (например, dbo.dInstalled_Software_Data или dbo.pInstalled_Software_Data), а процедура, как оказалось, пишет не в одну таблицу, а в несколько разных, и SP: STMTStarting, как раз, показывает, какая таблица не может принять данные (в моем случае, это оказалась совершенно левая таблица).
Правда, не удалось разобраться, как узнать, какое поле при этом нужно увеличивать. Пришлось увеличить все nvarchar. Благо полей оказалось не так много.
- Помечено в качестве ответа Иван Проданов Microsoft contingent staff, Moderator 28 мая 2013 г. 14:15
Для будущих поколений:
Проблема возникает при записи в таблицу INSTALLED_SOFTWARE_HIST, чье поле ServicePack00 имеет формат nvarchar(8), в то время в таблице, откуда копируются данные — INSTALLED_SOFTWARE_DATA — формат этого поля nvarchar(255).
Простое решение — это расширить проблемное поле до nvarchar(255), но без указки инженера Microsoft это переводит базу в состояние unsupported.
Проблема на самом деле заключается еще и в том, что в идеале в это поле никогда не должны писаться данные длиннее 1 символа. Если проверить содержимое этого поля после инвентаризации чистой машины, то там будет «1» в случае версии Service Pack 1. Однако в случае кастомных заливок в данных инвентаризации появляются 2 инстанса операционной системы, одна нормальная, вторая же содержит в этом поле «Service Pack 1» — 14 символов.
Источник появления второго инстанса ОС при инвентаризации WMI-класса Installed_Software пока неизвестен, скорее всего это какое-то расхождение в 32- и 64-хбитных ветках реестра HKLMSoftwareMicrosoftWindows NTCurrentVersion.
Правильное решение в этом случае: перезалить машину чистой проверенной заливкой или отключить инвентаризацию этого класса.
Тест машины на «кривость» — в консоли PS от имени администратора при установленном клиенте запустить: gwmi -namespace rootcimv2sms -query «select * from sms_installedsoftware
where Servicepack<>»»
Если выдается 1 инстанс — все хорошо, если два — машину стоит перезалить.
- Предложено в качестве ответа Pavel Yurenev Microsoft employee 9 октября 2013 г. 14:49
- Помечено в качестве ответа Иван Проданов Microsoft contingent staff, Moderator 10 октября 2013 г. 4:57
Неужели я такой счастливчик, что единственный словил этот баг.
А не подскажете как зарегистрировать можно?
А не подскажете как зарегистрировать можно?
В R2 точно не поправлено, т.к. не зарегистрировано как баг. Sad but true.
Большое спасибо, у меня руки так и не дошли зарегистрировать баг.
Правильное решение в этом случае: перезалить машину чистой проверенной заливкой или отключить инвентаризацию этого класса.
Попробовал на паре(20) машин, данные обновились:
1. Делаем коллекцию из старых машин(старые данные HardwareInventory):
select SMS_R_SYSTEM.ResourceID,SMS_R_SYSTEM.ResourceType,SMS_R_SYSTEM.Name,SMS_R_SYSTEM.SMSUniqueIdentifier,SMS_R_SYSTEM.ResourceDomainORWorkgroup,SMS_R_SYSTEM.Client from SMS_R_System inner join SMS_G_System_WORKSTATION_STATUS on SMS_G_System_WORKSTATION_STATUS.ResourceId = SMS_R_System.ResourceId where SMS_G_System_WORKSTATION_STATUS.LastHardwareScan
Если есть контракт премьер-поддержки, то Вы можете попросту попросить разрешение у меня, открыв заявку. В свою очередь я Вам буду настоятельно рекомендовать перезалить машины проверенным образом, как я писал выше.
Если честно, если Вы поменяете базу самостоятельно, с вероятностью 95% проблем не будет, а инженер поддержки этого попросту не заметит, если Вы сами ему не расскажете. 🙂
P.S. Фикс отложили на следующий релиз SCCM, который выйдет в 2015 году.
Столкнулся с такой же проблемой на SCCM 2012 R2 5.00.7958.1000.
Машины залиты проверенным, созданным и залитым через SCCM образом ОС Windows 7.
Проблема возникла словно сама собой месяца три назад, т.к. классы инвентаризации не менялись.
Сейчас проблемных машин — 80%.
1. Как мне получить это одобрение на модификацию БД (куплен EAS)?
2. Где можно увидеть в каком состоянии БД «unsupported» или «supported»?
3. Если она перейдет с состояние «unsupported» (после изменения длинны поля) — чем это чревато?
4. Где можно найти официальное описание/статус зарегистрированного бага SCCM 2012 R2 «bug (SMS 410599)» — «SMS_INVENTORY_DATA_LOADER Microsoft SQL Server 8152 SQL issued a message, the importance of 16: [22001] [8152] [Microsoft] [SQL Server Native Client 11.0] [SQL Server] String or binary data would be truncated. : pINSTALLED_SOFTWARE_DATA«?
Проблема возникает при записи в таблицу INSTALLED_SOFTWARE_HIST, чье поле ServicePack00 имеет формат nvarchar(8), в то время в таблице, откуда копируются данные — INSTALLED_SOFTWARE_DATA — формат этого поля nvarchar(255).
Простое решение — это расширить проблемное поле до nvarchar(255), но без указки инженера Microsoft это переводит базу в состояние unsupported.
Проблема на самом деле заключается еще и в том, что в идеале в это поле никогда не должны писаться данные длиннее 1 символа. Если проверить содержимое этого поля после инвентаризации чистой машины, то там будет «1» в случае версии Service Pack 1. Однако в случае кастомных заливок в данных инвентаризации появляются 2 инстанса операционной системы, одна нормальная, вторая же содержит в этом поле «Service Pack 1» — 14 символов.
Источник появления второго инстанса ОС при инвентаризации WMI-класса Installed_Software пока неизвестен, скорее всего это какое-то расхождение в 32- и 64-хбитных ветках реестра HKLMSoftwareMicrosoftWindows NTCurrentVersion.
Правильное решение в этом случае: перезалить машину чистой проверенной заливкой или отключить инвентаризацию этого класса.
Тест машины на «кривость» — в консоли PS от имени администратора при установленном клиенте запустить: gwmi -namespace rootcimv2sms -query «select * from sms_installedsoftware
where Servicepack<>»»
Если выдается 1 инстанс — все хорошо, если два — машину стоит перезалить.
А какой тут у меня инстанс на скриншоте, Подскажите.
Источник
I am trying to BCP a ton of data files into a SQL 2005 database. The first row of data in one of my files looks like:
1000|100000156752|100000176409|100000000000|100000000000|9.4|M|9.4||1/22/1993||1||||100|||||||||1|1/22/1993|||||||
The error file has this:
#@ Row 1, Column 7: String data, right truncation @#
0 0 0 0 0 .00 17|27.7|M|27.7||2/2/1993||1||||100|||||||||1|2/2/1993|||||||
I’ve built a format file based on the SQL Table definitions with this command:
FOR %%f IN (*.*) DO bcp IRIS.dbo.%%f format nul -T -n -t»|» -r»n» -f%%f.format
The format file for lines 1-8 look like:
1 SQLNUMERIC 1 19 «|» 1 SITE_ID «»
2 SQLNUMERIC 1 19 «|» 2 WEL_ID «»
3 SQLNUMERIC 1 19 «|» 3 WPOO_ID «»
4 SQLNUMERIC 1 19 «|» 4 WSMP_ID «»
5 SQLNUMERIC 1 19 «|» 5 CC_ID «»
6 SQLNUMERIC 1 19 «|» 6 CORE_LENGTH «»
7 SQLCHAR 2 2 «|» 7 LENGTH_MEASM_UNIT_ID SQL_Latin1_General_CP1_CI_AS
8 SQLNUMERIC 1 19 «|» 8 LENGTH_OF_CORE_RECOVD «»
Here is the DOS command window results for this file:
F:Data>cd import
F:DataImport>FOR %f IN (CONVT_CORES.*) DO bcp IRIS.dbo.%f in %f -e..BCP_Error
%f.error -Slocalhost -Usa -Psol3admin -f..BCP_Format%f.format
F:DataImport>bcp IRIS.dbo.CONVT_CORES in CONVT_CORES -e..BCP_ErrorCONVT_CORE
S.error -Slocalhost -Usa -Psol3admin -f..BCP_FormatCONVT_CORES.format
Starting copy…
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]String data, right truncation
SQLState = 22003, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]Numeric value out of range
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]String data, right truncation
BCP copy in failed
F:DataImport>cd..
So, what is wrong???
We have a PHP-application with the AWS RDS MariaDB as a backend.
On the previously used 10.0 version all was good, but right after we upgraded to the MariaDB 10.2 – got errors during tests:
PDOException: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column ‘name’ at row 1 in /data/projects/projectname/vendor/yiisoft/yii2/db/Command.php:1290
The first solution here could be just by changing the column’s type from the VARCHAR
to the LONGTEXT
, like that:
MariaDB [dbname]> ALTER TABLE table_name MODIFY column_name LONGTEXT;
But in this current case, this will be not the right way.
The solution
Check sql_mode
on the old MariaDB RDS with the 10.0:
MariaDB [(none)]> select @@sql_mode;
+------------+
| @@sql_mode |
+------------+
| |
+------------+
And on the new one, with the 10.2:
MariaDB [dbname]> select @@sql_mode;
+-------------------------------------------------------------------------------------------+
| @@sql_mode |
+-------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------+
And take a look at the Parameters group which is attached to the new RDS:
Here is what we need here – the STRICT_TRANS_TABLES
:
If a value could not be inserted as given into a transactional table, abort the statement.
Now, need to overwrite the default “”STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION“:” value to the NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
:
Re-connect to the MySQL console, and check again:
MariaDB [(none)]> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode |
+--------------------------------------------+
| NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
Done.
Similar posts
- 08/08/2019 AWS RDS: SQLSTATE[22001] – Data too long for column в MariaDB 10.2
- 05/14/2019 AWS: MariaDB RDS – kill: You are not owner of thread
- 12/13/2016 AWS: RDS Aurora db.t2.medium vs t2.nano и MariaDB
- 09/03/2016 AWS: миграция RTFM, часть #2: ручное создание инфраструктуры – AIM, S3, RDS и EBS
Внезапно, в логах стала появляться каждые 5 минут такая ошибка:
Quote2020.02.20 09:07:29.795 *E* [db.drv ] SQL query failed (Query = «INSERT INTO interfaces (node_id,if_type,if_index,mac_addr,required_polls,bridge_port,phy_chassis,phy_module,phy_pic,phy_port,peer_node_id,peer_if_id,description,admin_state,oper_state,dot1x_pae_state,dot1x_backend_state,peer_proto,alias,mtu,speed,parent_iface,iftable_suffix,id) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ON CONFLICT (id) DO UPDATE SET node_id=excluded.node_id,if_type=excluded.if_type,if_index=excluded.if_index,mac_addr=excluded.mac_addr,required_polls=excluded.required_polls,bridge_port=excluded.bridge_port,phy_chassis=excluded.phy_chassis,phy_module=excluded.phy_module,phy_pic=excluded.phy_pic,phy_port=excluded.phy_port,peer_node_id=excluded.peer_node_id,peer_if_id=excluded.peer_if_id,description=excluded.description,admin_state=excluded.admin_state,oper_state=excluded.oper_state,dot1x_pae_state=excluded.dot1x_pae_state,dot1x_backend_state=excluded.dot1x_backend_state,peer_proto=excluded.peer_proto,alias=excluded.alias,mtu=excluded.mtu,speed=excluded.speed,parent_iface=excluded.parent_iface,iftable_suffix=excluded.iftable_suffix»): 22001 ОШИБКА: значение не умещается в тип character varying(12)
С чем связано, непонятно.
Какая версия сервера используется? Откуда ставилась — из пакетов, или компилировалась?
Какая база данных?
Сервер 3.1.361
Debian 9.12
Ставилась из пакетов (и обновлялась)
БД PostgreSQL 9.6
Похоже не влезает MAC адрес. Могут быть какие-то ноды с интерфейсами, у которых MAC длиннее 6 байт?
Маловероятно, но ведь всякое бывает.
Не могу понять, как мне найти ту ноду, которая вызывает ошибку.
Тут поможет дебаг на 9 уровне. В принципе он нужен только по тегу db.query, но сейчас драйвер базы данных сделан так, что он включает нужно логирование только если глобальный дебаг при старте равен 9.
Можно сделать так — указать DebugLevel = 9 в конфиге сервера и сразу после запуска выполнить
nxadm -c "debug 0"
nxadm -c "debug db.query 9"
В логе перед строчкой SQL query failed должны будут быть строки с расшифровкой полей SQL запроса, по ним можно будет определить с какой нодой это связано.
Да, это помогло. Действительно у одного компьютера обнаружился mac-адрес из 7 байт. Удалил интерфейс, просканировал заново, ошибка исчезла. Спасибо!
- NetXMS Support Forum
-
►
Russian Support -
►
Общие вопросы -
►
Ошибка 22001: значение не умещается в тип character varying(12)