簡體   English   中英

一個存儲過程也可以更新整個表或單個列

[英]One stored procedure to update whole table or individual columns too

我有一個表userdata ,其中包含以下列:

userId
userName
userEmail
userContact
userDob
userAdd
userImage
userPass

我正在使用存儲過程從此表中選擇數據。

現在我想用存儲過程更新此表。 我能夠使用存儲過程更新此表,但我的要求是在profile.aspx我允許用戶使用存儲過程更新所有列。 但在其他形式中,我希望用戶僅更新幾列,例如在setting.aspx頁面上,我允許用戶僅更新userPass列。

所以我必須制作另一個存儲過程。 我有很多像這樣的桌子。 我想知道我需要創建多少存儲過程來更新具有不同列的許多表。

任何人都可以建議一個簡短的方法,以便我可以每表只有一個存儲過程來更新整個表或單個列,或任何c#代碼來縮短這個?

提前致謝

您可以在MS SQL Server中使用ISNULL功能,MSDN的以下聲明對此進行了解釋。

用指定的替換值替換NULL。

您可以編寫一個存儲過程,該過程會更新要在各種操作中更新的所有字段。 從所有頁面調用相同的過程。 然后從頁面只傳遞該頁面的相關參數,並且其余參數(與該頁面無關)傳遞null

您的存儲過程應該是這樣的

UPDATE dbo.userTable SET
userName = ISNull(@userName, userName),
userEmail= ISNull(@userEmail, userEmail),
-- list of all your table fields goes here
WHERE userID = @userID

如果你傳遞參數,它會做什么; 它將更新該字段的值; 如果為任何字段傳遞null ,它將使用其現有值更新該字段。 因此該字段在更新操作中不會受到影響。

您可以使用具有多個if.. else..條件的單個存儲過程來控制每個單個字段的更新。 然后,您可以將它們作為參數傳遞,以控制要更新的字段。

我認為你可以這樣做:在首頁,你應該設置你不想更新的字段,但是將值作為參數傳遞給store-procedure。 在store-procedure中,將這些字段的舊值駐留到相應的參數中,如果不相等,則更新它,否則不對這些字段執行任何操作。

你可以使用這樣的東西:

UPDATE tbl t
   SET t.userName =  CASE WHEN @userName  IS NULL THEN t.userName  ELSE @userName  END
     , t.userEmail = CASE WHEN @userEmail IS NULL THEN t.userEmail ELSE @userEmail END
     ,  ...
   WHERE t.userName = CASE WHEN @WHERE_userName IS NULL THEN t.userName ELSE @WHERE_userName END
     AND ...

因此,如果您不想更新特定字段,只需將DBNull.Value從代碼傳遞給該參數的過程調用。 請記住,僅當您不打算使用NULL值更新字段時,這才有效。 如果你需要空值,那么你可以重寫一點代碼,使其適用於空值。 如果您需要進一步的幫助,請發表評論。

獲取您需要更新的Datatable中的所有數據。 使用datatable.WriteXML方法並獲取Stream對象,所有字符串都使用XmlWriteMode.IgnoreSchema來獲取數據。

        DataTable dt = new DataTable();
        dt.WriteXml(stream object ,XmlWriteMode.IgnoreSchema)

現在創建接受Varchar(max)參數的過程並將Stream對象傳遞給過程。

之后,您可以使用Openxml或在Sqlserver中的XML變量中獲取所有這些內容,獲取@tablevariable或#temp表中的所有數據。

sqlserver中的OpenxmlXMl變量的Xml

那么你將獲得一個表中的所有東西使用該表來更新你的主鍵ID,如....

SQl qquery如下所示

Update "Database Table Name"
set .........
from "GetDatafromc#table"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM