我棘手的SQL Update查询工作得不好

时间:2010-06-15 12:35:29

标签: sql sql-server database

我正在尝试使用另一个表中的另一行更新数据库中的表。我有两个参数,一个是ID,另一个是行号(因为你可以从GUI中选择你想要的那个行)

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

(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但没有用)

1 个答案:

答案 0 :(得分: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