Сообщение 8152, уровень 16, состояние 14, строка строки 10 или двоичные данные будут усечены

#sql-server

#sql-server

Вопрос:

Сообщение 8152, уровень 16, состояние 14, строка строки 10 или двоичные данные будут усечены

 insert into Customers (CustomerID, CustomerName, Address, City, PostalCode, Country)
    values
        (3, 'Antonio Moreno Taquería', 'Mataderos 2312', 'México D.F.', 05023,  'Mexico'),
        (4, 'Around the Horn', '120 Hanover Sq.', 'London', 110025, 'UK'),
        (5, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', 0022,  'Sweden'),
        (6, 'Blauer See Delikatessen', 'Forsterstr. 57', 'Mannheim', 68306, 'Germany'),
        (7, 'Blondel père et fils', '24 place Kléber',  'Strasbourg', 67000, 'France'),
        (8, 'Bólido Comidas preparadas', 'C/ Araquil, 67', 'Madrid', 28023, 'Spain'),
        (9, 'Bon app''', '12, rue des Bouchers',    'Marseille', 13008, 'France'),
        (10, 'Bottom-Dollar Marketse', '23 Tsawassen Blvd.', 'Tsawassen',284, 'Canada')
  

Комментарии:

1. Возможно, из-за этого ` (9, ‘Bon app»‘, ’12, rue des Bouchers’, ‘Марсель’, 13008, ‘Франция’), ` . ‘Bon app»‘ <— их три (‘). Но из-за ограниченной информации я не уверен

2. Ошибка очевидна, вы пытаетесь вставить длинную строку в короткий столбец. Вы не опубликовали сценарий создания таблицы, поэтому невозможно угадать, какое значение вызывает проблему. Попробуйте закомментировать строки, пока не найдете, в какой из них возникла проблема. Начните с закомментирования первой половины значений

3. Кстати, ваши строки содержат неанглийские символы. Вероятно, вам следует использовать nvarchar поля и литералы Юникода (с префиксом N), чтобы избежать ошибок преобразования

4. Вы еще не опубликовали какую-либо соответствующую информацию. Невозможно угадать, какой столбец слишком короткий. Единственный совет, который можно дать, это написать запрос, который возвращает максимальный размер для каждого столбца в данных, и проверить, какой столбец таблицы короче. Что-то вроде select max(len(CustomerID)), max(len(CustomerName)), max(len(Address)), max(len(City)), max(len(PostalCode)), max(len(Country)) from (values ....) t1(CustomerID,CustomerName...)

5. На несвязанной заметке похоже, что вы рассматриваете почтовый индекс как число. Не делайте этого. Это не числа, вы не складываете их вместе или не умножаете. И, например, почтовый индекс Великобритании не похож 110025 . Похоже PO143AU .

Ответ №1:

Невозможно ответить на этот вопрос без схемы таблицы, то CREATE TABLE есть инструкции. Сама ошибка вполне понятна, запрос пытается вставить строковое значение в более короткий столбец. Без определения таблицы невозможно определить, что это за таблица.

Лучшее, что можно сделать, это предложить способы устранения этой проблемы. Проще всего было бы просто закомментировать строки до тех пор, пока ошибка не исчезнет.

Другим вариантом было бы вычислить максимальную длину для каждого столбца в данных и сравнить ее с определениями столбцов, например, с :

 select max(len(CustomerID)) as CustomerID, max(len(CustomerName)) as CustomerName, 
        max(len(Address)) as Address, max(len(City)) as City, max(len(PostalCode)) as PostalCode, 
        max(len(Country)) as Country
from (values 
        (3, 'Antonio Moreno Taquería', 'Mataderos 2312', 'México D.F.', 05023,  'Mexico'),
        (4, 'Around the Horn', '120 Hanover Sq.', 'London', 110025, 'UK'),
        (5, 'Berglunds snabbköp', 'Berguvsvägen 8', 'Luleå', 0022,  'Sweden'),
        (6, 'Blauer See Delikatessen', 'Forsterstr. 57', 'Mannheim', 68306, 'Germany'),
        (7, 'Blondel père et fils', '24 place Kléber',  'Strasbourg', 67000, 'France'),
        (8, 'Bólido Comidas preparadas', 'C/ Araquil, 67', 'Madrid', 28023, 'Spain'),
        (9, 'Bon app''', '12, rue des Bouchers',    'Marseille', 13008, 'France'),
        (10, 'Bottom-Dollar Marketse', '23 Tsawassen Blvd.', 'Tsawassen',284, 'Canada')) 
    x(CustomerID, CustomerName, Address, City, PostalCode, Country)
  

Это возвращает :

 CustomerID  CustomerName    Address City    PostalCode  Country
2           25              20      11      6           7
  

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

У самого запроса есть и другие проблемы.

  • Он содержит неанглийские буквы, такие как é , ä и å в строках ASCII.
  • Он обрабатывает почтовые коды как числа, когда они могут быть любыми, какими их хочет видеть страна. Мой почтовый индекс Манчестера был M60 7LH . Дэмиен в опубликованных комментариях PO14 3AU , которые, по словам Google, находятся в Fareham. Размер отличается даже в одной и той же стране

Столбцы таблицы должны быть nvarchar(...) , запрос должен использовать строковые литералы, т.Е. N'México D.F.' Вместо 'México D.F.' и почтовый индекс должен быть сохранен в nvarchar() поле