2010-06-15 98 views
2

我想用另一个表中的另一行更新我的数据库中的表。我有两个参数,一个是ID,另一个是行号(因为你可以从GUI中选择你想要的行)我的棘手的SQL更新查询不能很好地工作

这部分代码工作正常,这将返回单行的一列。

(SELECT txtPageContent 
FROM (select *, Row_Number() OVER (ORDER BY ArchiveDate asc) as rowid 
      from ARC_Content Where ContentID = @ContentID) as test 
Where rowid = @rowID) 

它只是当我尝试添加更新/设置它将无法正常工作。我可能缺少一些东西

UPDATE TBL_Content 
Set TBL_Content.txtPageContent = (select txtPageContent 
FROM (select *, Row_Number() OVER (ORDER BY ArchiveDate asc) as rowid 
      from ARC_Content Where ContentID = @ContentID) as test 
Where rowid = @rowID) 

感谢您的帮助! (我已经尝试过1并没有效果)

+0

你什么错误? – 2010-06-15 12:37:12

+1

您可能需要将tbl_content添加到您的from语句中,将它加入到从中获取数据的表中。 – 2010-06-15 12:38:09

+0

接受答案,如果它适合你 – 2010-07-27 06:39:28

回答

2

我发现你的更新有几个问题。首先,我没有看到您正在更新的表格的任何加入或选择标准。这意味着表中的每一行都将更新为新的值。那真的是你想要的吗?

其次,GUI上的内容与数据库中的内容之间的行号可能不匹配。即使您重现了用于在GUI中创建列表的查询(无论如何这都是危险的,因为它涉及保持更新和选择代码始终保持同步),所以有可能有人可以在时间之间插入,删除或更新行您填写您的列表框并将该行号发送到服务器以进行更新。使用PK(在你的情况下可能是ID)来确定哪一行用于更新会更好。

这就是说,我认为下面就为你(未经测试)工作:

;WITH cte AS (
    SELECT 
     txtPageContent, 
     ROW_NUMBER() OVER (ORDER BY ArchiveDate ASC) AS rowid 
    FROM 
     ARC_Content 
    WHERE 
     ContentID = @ContentID) 
UPDATE 
    TC 
SET 
    txtPageContent = cte.txtPageContent 
FROM 
    TBL_Content TC 
INNER JOIN cte ON 
    rowid = @rowID