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

时间:2019-02-09 14:30:35

标签: sql xml sql-server-express

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

该表中有多列,但与之相关的两个是NameInfo

Name包含帐户用户名,而Info包含约100行xml标记,用于表示该用户的帐户首选项和设置。其中一行是<User Status> Deactivated </User Status>,也可以将其设置为<User Status> Activated </User Status>,具体取决于之后是否忘记了停用该帐户。

我必须每天通过加载GUI,登录并通过其属性更改状态大概一天更改30次此帐户状态。由于GUI加载速度太慢,每次状态更改大约需要6分钟,并且旋转时需要输入3个密码才能登录GUI,因此这是一个猜谜游戏。 GUI不会很快改变,因此我只想删除一个脚本以将用户状态设置为停用或激活。

我这样做正确吗?

2 个答案:

答案 0 :(得分:0)

我认为,在这里有用的是使用XML参数创建存储过程。

您应该使用输入参数标记表中的列,并根据发生更改的用户ID来自动更新“用户状态”中的值。

有关更多详细信息,请查看此链接TSQL: How to use XML parameters in stored procedures

答案 1 :(得分:0)

您的问题是:您正在处理看起来像XML的东西,但这不是有效的XML。 Check the naming rules here

不允许这样的元素:

 <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"');

更新

开发人员做这种愚蠢的事情真的很烦。现在,您必须处理这种混乱。有时我们必须忍受它...

由于您的“ 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 ...