2009-12-29 182 views
0

非常簡單的查詢你們,即時消息只是新的這一點。這裏是場景 - 一個表格有10個字段。在第一個aspx頁面上,我插入了前5個字段(programid就是其中之一)。在第二個aspx頁面上,我更新了前一個屏幕(同一個programid)中輸入的下一個5個字段的相同記錄。但是programid不是唯一的。一個programid可以有多個記錄。我有一個唯一身份增量的ID字段。更新SQL Server

我需要可以採取最新的ID和programid,然後只更新記錄,而不是所有記錄

update table a 
set field 6='abc',... 
where programid = @programid AND 
     ID = (select id from tablea where programid = @programid order by id desc) 

我希望你的想法

感謝查詢提前

回答

-1
UPDATE table SET 
    X = x, ....... 
WHERE programId = @programId 
AND id = (
    SELECT MAX(id) 
    FROM table 
    WHERE programId = @programId 
) 
+0

MAX(id)可以創建一些醜陋的競爭條件。我以前見過它。 – ristonj 2009-12-29 22:44:46

+0

在這種情況下,海報還有什麼要繼續? – 2009-12-29 22:49:41

+0

好吧,我看到你在說什麼,但是我認爲你誤解了海報的要求(不是你的錯,這個問題可能會更清楚)。他/她想要在一個頁面上插入項目,然後在下一個頁面上更新它們,而不是全局「讓我插入任何人的最後五件事」查詢。 – ristonj 2009-12-29 23:45:54

2

你可以讓你的第一個查詢返回eac的ID h插入。
我通常通過在存儲過程中放置​​一個名爲@ID(或類似的)的輸出參數來完成此操作。這是基本概述:

ALTER PROCEDURE [dbo].[usp_YourInsertProcedure] 
(
    @ProgramID INT, other params... ...   
    @ID INT = NULL OUTPUT 
) AS BEGIN 
    SET NOCOUNT ON; 

    begin try 
     INSERT INTO ..... 
    end try 
    begin catch end catch --nothing to do in catch block.. 
    set @id = coalesce(scope_identity(), -1) --gets the id of the inserted row 
END 

在您的應用程序代碼中,在調用插入過程後,請獲取@id。然後,您可以將其傳遞給第二個aspx頁面以用於更新語句中。如果您獲得ID爲-1的值,則表示插入失敗。

除了使用輸出參數,您可以使用返回值,但返回值通常用於報告成功或失敗代碼,並且以這種方式使用它們可能會被視爲'hacky'。

請參閱Scope_Identity,這是一個非常有用的t-sql函數。

+0

海報不在相同的過程中插入記錄。通過這篇文章,我猜測任何數量的進程都可以向表中寫入記錄。這不會工作,除非最後一個插入只是被同一個進程插入。 – 2009-12-29 23:12:12

+0

他說這是一個兩步過程:第1步,他做了一個插入。第2步是更新。 scope_identity不會被其他線程搶佔,所以沒有問題。 – dan 2009-12-30 02:19:07

+0

@@ identity會引起問題,因爲它是一個全局變量.. – dan 2009-12-30 02:29:03

0
UPDATE tablea 
SET field6 = @valueForField6, ... 
WHERE programId = @programId 
AND id = 
(
    SELECT TOP 1 id 
    FROM tablea 
    WHERE programId = @programId 
    ORDER BY id DESC 
) 

這將完成你說你正在嘗試做的 - 但我認爲你可能有一點問題的,如果你要更新由以前的頁面添加的條目,而不僅僅是最後添加記錄。

如果多個用戶嘗試使用相同的programId將條目添加到此表中,該怎麼辦?

我可能不是正確的軌道上,但你可以做這樣的事情:

INSERT INTO tablea (programId, field1, field2, field3, field4, field5) 
OUTPUT INSERTED.Id 
VALUES(@programId, @valueForField1, @valueForField2, @valueForField3, @valueForField4, @valueForField5) 

然後,您可以傳遞返回ID到下一個頁面(例如,如果您正在使用asp.net你可以更改按鈕上的操作,或者可以在Session變量中傳遞它)。

然後,當您去更新時,您可以使用直接ID進行更新,例如,

UPDATE tablea 
SET field6 = @valueForField6 
WHERE id = @valuePassedThroughToNextPage