消息8152,级别16,状态14,行10字符串或二进制数据将被截断

时间:2019-04-10 07:11:35

标签: sql-server

信息8152(级别16,状态14,行10)将截断字符串或​​二进制数据

def position(x) :
    y=[]
    a=str(x)
    if a[0]=='b' : # is a variable and it's not defined but 'b' is a string
        y.append(0)
    else: 
        y.append(1)
    return y

1 个答案:

答案 0 :(得分:0)

没有表模式(即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。达米安(Damien)在PO14 3AU发表的评论中,谷歌称该评论位于费勒姆。即使在同一国家/地区,尺寸也不同

表列应为nvarchar(...),查询应使用字符串文字,即N'México D.F.'而不是'México D.F.',邮政编码应存储在nvarchar()字段中< / p>