簡體   English   中英

更新SQL表列中包含的xml屬性的值

[英]Update value of xml attribute contained in a SQL table column

sqlcmd -S .\SQLEXPESS
USE Directory
    SELECT Info FROM dbo.User WHERE Name = TestACC
    SET [User Status].modify('replace value of 
    (/User/[User Status]/text())[1] with ("Activated")')
    GO

我有一個數據庫Directory

dbo.User

該表中有多列,但與IM有關的兩個是NameInfo

Name包含帳戶用戶名, Info包含約100行xml標記,用於表示該用戶的帳戶首選項和設置。 其中一行是<User Status> Deactivated </User Status> ,也可以將其設置為<User Status> Activated </User Status>具體取決於之后是否忘記了停用該帳戶。

我必須每天通過加載GUI,登錄並通過其屬性更改狀態,大概每天更改30次此帳戶狀態。 由於GUI加載速度太慢,每次狀態更改大約需要6分鍾,並且旋轉時需要輸入3個密碼才能登錄GUI,因此這是一個猜謎游戲。 GUI不會很快改變,因此我只想刪除一個腳本以將用戶狀態設置為停用或激活。

我這樣做對嗎?

我認為,在這里有用的是使用XML參數創建存儲過程。

您應該使用輸入參數標記表中的列,並根據發生更改的“用戶”的ID來自動更新“用戶狀態”中的值。

有關更多詳細信息,請查看此鏈接TSQL:如何在存儲過程中使用XML參數

您的問題是:您正在處理看起來像XML的東西,但這不是有效的XML。 在此處檢查命名規則

不允許這樣的元素:

 <User Status> Deactivated </User Status>

您可以將其更改為

<User Status="Deactivated"/>

或者

<User_Status> Deactivated </User_Status>

您的代碼實際上是完全錯誤的:

USE Directory
    SELECT Info FROM dbo.User WHERE Name = TestACC
    SET [User Status].modify('replace value of 
    (/User/[User Status]/text())[1] with ("Activated")')

除了無效的XML,您還必須使用一些其他內容

UPDATE dbo.User SET Info.modify('replace value of (someXpathHere)[1] with "SomeValue"');

UPDATE

開發人員做這種愚蠢的事情真的很煩人。 現在,您必須處理這種混亂。 有時我們不得不忍受...

由於您的“ XML”實際上不是有效的XML,因此您有兩種選擇:

  1. 將其更改為XML(使用類似REPLACE字符串方法)並處理XML方法(然后刪除您的更改)或
  2. 將其作為字符串處理。

我建議嘗試一個簡單的

UPDATE dbo.User 
SET Info=REPLACE(Info
                ,'<User Status> Deactivated </User Status>'
                ,'<User Status> Activated </User Status>');

這種方法取決於確切的書寫方式,其他使用空格等方式可能會破壞此效果...您可能會想到一些RegEx ...

暫無
暫無

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

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