更新查询不起作用

时间:2016-03-03 14:22:22

标签: sql-server sql-server-2008

以下查询抛出:

  

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中 有人可以提供帮助

4 个答案:

答案 0 :(得分:3)

从nvarchar转换为varchar会丢失无法转换的数据。 table2.cust_line1_name(nvarchar(140))中的任何外语都不适合你的varchar 24

正确的行动方针:

如果table1列有数据:

  1. 将nvarchar(140)列添加到表1
  2. 从当前varcahar(24)列复制数据
  3. Drop varchar(24)column
  4. 将新的nvarchar(140)列重命名为旧列名称
  5. 如果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