2017-09-01 96 views
0

背景基於結果從一個select語句

我想更新一組特定的行C#更新SQL Server表,從表中的select語句返回。該表由一個id和值組成。這些ID不是唯一的,因爲有一列表示修訂。

目前

什麼我希望做的是從C#中更新每個ID的最近修正值。

到目前爲止,我編寫的select語句返回了最新版本的所有id和值。

SELECT id, value 
FROM table1 AS T1 
WHERE createdOn = (SELECT MAX(createdOn) 
        FROM table1 AS T2 
        WHERE T1.id = T2.id) 

我在C#中創建了包含id和值的SQL參數。我將使用id來確定哪一行需要插入新值。我當然會使用該值作爲插入該ID的值。

下面是參數:

SqlParameter idParameter = new SqlParameter("@id", SqlDbType.Int); 
SqlParameter valueParameter = new SqlParameter("@updatedValue", SqlDbType.NVarChar); 

在C#我有用於存儲已經在之前的代碼更新到它們的新值的ID和值的字典。

Dictionary<int, string> updatedValues = new Dictionary<int, string>(); 

我通過這本字典打算循環,並設置SQL參數,在字典中的當前鍵和值。我目前的代碼如下所示:

foreach (var entry in updatedValues) 
{ 
    idParameter.Value = entry.Key; 
    valueParameter.Value = entry.Value; 

    //perform sql update command 
} 

正如註釋所示,我認爲在這裏需要執行SQL更新命令。

關於如何做到這一點以及SQL查詢字符串看起來像確保只有最新版本更新的指導,將不勝感激。

事情我已經試過

我試圖修改我的SQL查詢中使用連接到然後希望更容易修改成一個更新命令,沒有運氣。我也試圖從查詢中插入結果到臨時表中,然後嘗試在臨時表上執行更新。然而,當我嘗試將臨時表放入實際表格時,我遇到了另一個問題。

在此先感謝

附註:我已經爲了嘗試讓別人適應自己的代碼更容易修改變量名稱如果解決方案爲他們工作很順利

+0

我很困惑,固然它不需要很多...您的SQL查詢根據創建的日期獲取最新的ID和值,然後將其加載到字典中並希望遍歷字典以更新最新修訂版本?但是,你是不是隻用最新的最新動態來更新最新的?或者這個更新進入不同的表格? – Leonidas199x

+0

是的,我想遍歷字典來執行更新命令爲每個ID在C#代碼之前更新的值。計算已經在要插入的新值上完成。我已經獲得了數據,並對其進行了修改,現在我正在將這些新數據放回到數據庫中。希望這個清除一點! –

回答

0

這是你的SELECT語句:

SELECT id, value 
FROM table1 AS T1 
WHERE createdOn = 
    (SELECT MAX(createdOn) 
     FROM table1 AS T2 
     WHERE T1.id = T2.id) 

和相應的更新語句應該是:

UPDATE T1 
SET T1.value = 'your value' 
FROM table1 AS T1 
WHERE createdOn = 
    (SELECT MAX(createdOn) 
     FROM table1 AS T2 
     WHERE T1.id = T2.id) 
+0

非常感謝!是否有機會以不同的順序檢索結果?我是否需要從我的SQL參數中指定id並在update語句中使用它?像id = @id –

+0

我稍微修改了更新語句以包含id ='@id'只是爲了安全起見,但是感謝一萬! –

0

你就不能檢索createdOn在您的原始選擇語句中,然後使用它以及id來標識確切的行,例如

UPDATE table1的設定值= @updatedValue WHERE ID = @id和createdOn = @createdOn

+0

你是說我需要以某種方式在我的C#代碼中存儲createdOn,然後在更新語句中將它用作參數? –

+0

是的,這就是我的建議。我誤解了你的問題嗎? – spodger

+0

不,你沒有,我覺得它可能是一個解決方案,但我需要修改我的字典,以允許我存儲3個值。你認爲使用id作爲一個鍵,然後創建一個Pair 作爲值將工作? –

0

我認爲你可以通過使用分區,儘量select distinct id,max(createdOn) over (partition by id) as "lastcreatedOn" from YourTable 這將通過每個ID的分區表,並選擇最大的日期每個ID的值。把它放到一個存儲過程中,傳遞你的id和新的值,把這種工作加載到數據庫服務器上,而不是你的c#代碼,我建議。
編輯:也許是這樣

CREATE PROCEDURE UpdateWhatever 
    <@id> nvarchar(255), 
    <@value> nvarchar(255) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    select distinct id,@LastRev = max(createdOn) over (partition by id) as "lastcreatedOn" 
from YourTable 
where [email protected] 

update YourTable set value = @val 
where [email protected] and [email protected] 
END 
+0

我真的很喜歡這個SQL代碼,但我不確定你的意思是「將它放入存儲過程」 - 你能澄清一下嗎? –