[英]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表中的所有數據。
那么你將獲得一個表中的所有東西使用該表來更新你的主鍵ID,如....
SQl qquery如下所示
Update "Database Table Name"
set .........
from "GetDatafromc#table"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.