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
该表中有多列,但与之相关的两个是Name
和Info
。
Name
包含帐户用户名,而Info
包含约100行xml标记,用于表示该用户的帐户首选项和设置。其中一行是<User Status> Deactivated </User Status>
,也可以将其设置为<User Status> Activated </User Status>
,具体取决于之后是否忘记了停用该帐户。
我必须每天通过加载GUI,登录并通过其属性更改状态大概一天更改30次此帐户状态。由于GUI加载速度太慢,每次状态更改大约需要6分钟,并且旋转时需要输入3个密码才能登录GUI,因此这是一个猜谜游戏。 GUI不会很快改变,因此我只想删除一个脚本以将用户状态设置为停用或激活。
我这样做正确吗?
答案 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,因此您有两种选择:
REPLACE
之类的字符串方法)并处理XML方法(然后删除您的更改)或我建议尝试一个简单的
UPDATE dbo.User
SET Info=REPLACE(Info
,'<User Status> Deactivated </User Status>'
,'<User Status> Activated </User Status>');
这种方法取决于确切的书写方式,其他使用空格等方式可能会破坏此效果...您可能会想到一些RegEx ...