为什么在DB中错误地更新了行?

时间:2016-04-28 06:45:34

标签: sql sql-server database sql-update

我处于需要更新两列行的情况,我无法找到正确的解决方案。

我有这样的表:

table1 :

nid  listName ltitle
1     lsn1      lst1
2     lsn2      lst2

现在这个nid是table2的外键(listid)

table2

nid listid listcol1 listcol2
1    1     "lstxt1" "lscol1" //belongs to lsn1
2    1     "lstxt2" "lscol2" //belongs to lsn1
3    1     "lstxt3" "lscol3" //belongs to lsn1
3    2     "lstxt4" "lscol4" //belongs to lsn2

为了更好地理解,有两个名为lsn1和lsn2的列表,第一个列表有2列listcol1和listcol2,listcol1包含来自的数据 通过一个字符串,我分开" ###"对于listcol2

,类似于此"lstxt1###lstxt2###lstxt3###"的分隔符

我尝试在存储的prcodure中更新用户更改的数据表:

update table1 set listName=@listName ,ltitle=@ltitle   //table 1 update and it works well
where nid=@nid  

update table2 set listId=@nid, listcol1=a.part,listcol2= b.part from     //table2 update , problem is here
dbo.splitstring(@listcol1,'###') a inner join       
dbo.splitstring(@listcol2,'###') b on a.id=b.id where table2.listid=@nid  

这里的问题是: (1)table1正确更新但table2更新输出错误(假设我试图更新table1中的nid = 1):

listcol1 listcol2
"lstxt5" "lscol5" //belongs to lsn1
"lstxt5" "lscol5" //belongs to lsn1
"lstxt5" "lscol5" 

我的意思是它将第一行更新为所有行。预期产出在哪里:

listcol1 listcol2
"lstxt5" "lscol5" //belongs to lsn1
"lstxt6" "lscol6" //belongs to lsn1
"lstxt7" "lscol7"

(2)当用户添加新行时,它不会在该行中显示更新。它也必须显示出来。

1 个答案:

答案 0 :(得分:0)

这部分代码(据我理解你的逻辑)肯定没有任何意义:listcol1=a.part,listcol1= b.part

这应该会给你一个错误:

  

Msg 264,Level 16,State 1,Line 3   列名' listcol1'在INSERT的SET子句或列列表中多次指定。在同一子句中不能为列分配多个值。修改子句以确保列只更新一次。如果此语句将列更新或插入到视图中,则列别名可以隐藏代码中的重复。"

update table1 set listName=@listName ,ltitle=@ltitle   //table 1 update and it works well
where nid=@nid  

update table2 set listId=@nid, **listcol1=a.part,listcol1= b.part** from     //table2 update , problem is here
dbo.splitstring(@listcol1,'###') a inner join       
dbo.splitstring(@listcol2,'###') b on a.id=b.id where table2.listid=@nid