繁体   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