我处于需要更新两列行的情况,我无法找到正确的解决方案。
我有这样的表:
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)当用户添加新行时,它不会在该行中显示更新。它也必须显示出来。
答案 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