以下查询抛出:
Msg 8152,Level 16,State 2,Line 1字符串或二进制数据 截断。声明已经终止。
update table1
set cust_line1_name = c.cust_line1_name
from table1 d
inner join dbo.table2 c
on c.cust_nbr = d.cust_id
and c.bus_grp_id = d.bus_grp_id
table1
cust_line1_name - varchar(24)
table2
cust_line1_name - nvarchar(140)
我检查了长度大于24的数据是否正在更新,但是没有这样的数据
SELECT LEN(c.cust_line1_name), c.cust_line1_name
from table1 d
inner join dbo.table2 c
on c.cust_nbr = d.cust_id
and c.bus_grp_id = d.bus_grp_id
WHERE LEN(c.cust_line1_name)> 24
以上查询退出零结果。问题出在SQL Server 2008中 有人可以提供帮助
答案 0 :(得分:3)
从nvarchar转换为varchar会丢失无法转换的数据。 table2.cust_line1_name(nvarchar(140))中的任何外语都不适合你的varchar 24
正确的行动方针:
如果table1列有数据:
如果table1列没有数据,只需删除它,并使用table2中的数据填充新列,其大小和数据类型与table2中的相同。
答案 1 :(得分:0)
您错过了更新表(table1)与from子句中的两个表之间的链接:
您的查询:
update table1
set cust_line1_name = c.cust_line1_name
from table1 d
inner join dbo.table2 c
on c.cust_nbr = d.cust_id
and c.bus_grp_id = d.bus_grp_id
您必须添加WHERE条件才能决定如何更新table1
例如,您可以添加
WHERE table1.id = d.id
因为d是同一个表(table1)
否则,你如何编写查询,你试图在标量字段中放入一个行列表(d和c表之间的连接结果)
答案 2 :(得分:0)
update table1
set cust_line1_name = left(c.cust_line1_name, 24)
from table1 d, dbo.table2 c
Where c.cust_nbr = d.cust_id
and c.bus_grp_id = d.bus_grp_id
答案 3 :(得分:0)
对条件进行更改,然后才能正常工作。 查询是:
UPDATE table1
SET cust_line1_name = c.cust_line1_name
FROM table1 d INNER JOIN dbo.table2 c
ON c.cust_nbr = d.cust_id
AND c.bus_grp_id = d.bus_grp_id
AND LEN(c.cust_line1_name)<= 24