我正在运行data.bat文件,其中包含以下行:
Rem Tis batch file will populate tables
cd\program files\Microsoft SQL Server\MSSQL
osql -U sa -P Password -d MyBusiness -i c:\data.sql
data.sql文件的内容是:
insert Customers
(CustomerID, CompanyName, Phone)
Values('101','Southwinds','19126602729')
还有8行类似的行用于添加记录。
当我和你一起做这个的时候 start
> run
> cmd
> c:\data.bat
,我收到以下错误消息:
1>2>3>4>5>....<1 row affected>
Msg 8152, Level 16, State 4, Server SP1001, Line 1
string or binary data would be truncated.
<1 row affected>
<1 row affected>
<1 row affected>
<1 row affected>
<1 row affected>
<1 row affected>
另外,我显然是个新手,但你怎么办 Level #
,和 state #
我的意思是,如何查找错误消息,比如上面的8152?
17条答案
按热度按时间ogsagwnx1#
来自@gmmastros的回答
每当你看到这个消息。。。。
字符串或二进制数据将被截断
想想你自己。。。字段不够大,无法容纳我的数据。
检查customers表的表结构。我想您会发现一个或多个字段的长度不够大,无法容纳要插入的数据。例如,如果phone字段是varchar(8)字段,并且您尝试在其中输入11个字符,则会出现此错误。
j2qf4p5b2#
我有这个问题,虽然数据长度比字段长度短。结果发现,问题是有另一个日志表(用于审计跟踪),由主表上的触发器填充,其中的列大小也必须更改。
vhipe2zx3#
在一个
INSERT
语句试图在字符串中插入过长的字符串(varchar
或者nvarchar
)列。如果不清楚
INSERT
只要看一眼剧本,你就能数到罪犯的名字<1 row affected>
出现在错误消息之前的行。得到的数字加上一就得到了语句号。在您的例子中,它似乎是产生错误的第二个插入。x8goxv8g4#
有些数据无法放入数据库列(小)。发现问题不容易。如果使用c#和linq2sql,可以列出将被截断的字段:
首先创建助手类:
然后为提交更改准备 Package :
准备全局异常处理程序和日志截断详细信息:
最后使用代码:
cvxl0en25#
我只是想提供更多的信息:我有同样的问题,这是因为字段不够大,无法容纳传入的数据,这个线程帮助我解决了这个问题(上面的答案说明了这一切)。
但了解可能导致这种情况的原因是非常重要的。
在我的例子中,我是用如下字段创建表的:
因此字段“period”的长度为零,导致插入操作失败。我将它改为“”,这是传入数据的长度,现在它工作正常(因为字段现在的长度为6)。
我希望这能帮助任何有同样问题的人:)
qq24tv8q6#
出现此错误的另一种情况如下:
我也有同样的错误,原因是在从联合接收数据的insert语句中,列的顺序与原始表不同。如果您将#表3中的顺序更改为a、b、c,您将修复错误。
5cnsuln77#
在sql server上,您可以使用如下方式关闭ansi\U警告:
eanckbw98#
这个问题也发生在web应用程序表面。最终发现相同的错误消息来自特定表中的sql update语句。
最后发现相关历史表中的列定义没有Map
nvarchar
某些特定情况下的类型。wnrlj8wa9#
我也有同样的问题。我的专栏篇幅太短了。
您可以增加或缩短要放入数据库的文本的长度。
kqhtkvqz10#
我也有同样的问题,即使在增加了表中有问题的列的大小之后。
热释光;dr:相应表类型中匹配列的长度可能也需要增加。
在我的例子中,错误来自microsoft dynamics crm中的数据导出服务,该服务允许crm数据同步到sql server db或azure sql db。
经过长时间的调查,我得出结论,数据导出服务必须使用表值参数:
可以使用表值参数将多行数据发送到transact-sql语句或例程(如存储过程或函数),而无需创建临时表或许多参数。
正如您在上面的文档中所看到的,表类型用于创建数据摄取过程:
不幸的是,无法更改表类型,因此必须完全删除并重新创建它。因为我的表有300多个字段(?),所以我创建了一个查询,以便于根据表的列定义创建相应的表类型(只需替换)
[table_name]
表名):更新表类型后,数据导出服务再次正常运行!:)
chhqkbe111#
当我试图执行我的存储过程时,我遇到了同样的问题,因为我需要添加一些数据的列的大小比我想要添加的数据要短。
您可以增加列数据类型的大小或减少数据的长度。
ppcbkaq512#
另一种可能发生此错误的情况是在SQLServerManagementStudio中。如果表中有“text”或“ntext”字段,则无论更新哪种类型的字段(例如位或整数)。似乎工作室不会加载整个“ntext”字段,也会更新所有字段而不是修改后的字段。要解决此问题,请从managementstudio中的查询中排除“text”或“ntext”字段
ubbxdtey13#
凯文·波普在公认答案下的评论正是我所需要的。
在我的例子中,问题是在我的表上定义了触发器,可以将update/insert事务插入到审计表中,但是审计表的数据类型不匹配,其中
VARCHAR(MAX)
在原始表中存储为VARCHAR(1)
在audit表中,所以当我插入任何大于VARCHAR(1)
在原始表列中,我将得到此错误消息。8ehkhllq14#
我使用了另一种策略,在某些地方分配8k的字段。这里只使用了大约50/100。
我想要速度,因为我总共有100万条记录,而且加载了28k条记录。
w6mmgewl15#
此错误可能是由于字段大小小于输入的数据。
例如,如果您有数据类型
nvarchar(7)
如果您的值是'aaaaddddf',则错误显示为:字符串或二进制数据将被截断