表名为 MasterTable
列
ID类型BIGINT,
Nametype VARCHAR(200)(xml由于某些原因存储类型数据)
Name 包含结构化的数据
<en-US>SomeEnglishText</en-US><it-IT>SomeItalicText</it-IT>
当我需要Update的Master表,然后在那个时候我需要转换Varchar到xml那么有条件更新/更换的value即或者特定标签的一部分en-US / it-IT.
还有一些机会,没有任何数据/标签有没有在Name列,所以我想在插入数据会的时间Insert清空表像标签元素<en-US></en-US><it-IT></it-IT>,所以update查询必须处理空值,即在标签元素en-US/it-IT.
我想像下面的更新查询一样.
DECLARE @Str VARCHAR(200)
SET @Str = 'Test Text'
UPDATE [MasterTable]
SET [Name] = cast([MasterTable].[Name] as xml).modify('replace value of (en-US/text())[1] with sql:variable("@Str")')
WHERE [ID]=18
Run Code Online (Sandbox Code Playgroud)
运行查询时出现以下错误
非法使用xml数据类型方法'修改'.在此上下文中期望非变异方法.
我在BaseX中存储了两个XML文档,即医院和办公室.
以下是办公室xml:
<Staff>
<Employee Name="Brian">
<Personal>
<SSN> 666-66-6666 </SSN>
</Personal>
<StaffInfo>
<Position> Doctor </Position>
<AccountableTo> David </AccountableTo>
</StaffInfo>
</Employee>
<Employee Name="David">
<Personal>
<SSN> 555-55-5555 </SSN>
</Personal>
<StaffInfo>
<Position> Doctor </Position>
<AccountableTo />
</StaffInfo>
</Employee>
</Staff>
Run Code Online (Sandbox Code Playgroud)
在这个XML中,我想添加一个或多个员工.如何使用BaseX添加元素?
我有一个xml文档如下
<users>
<user test="oldvalue">
<userid>sony</userid>
<name>vijay</name>
</user>
</users>
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写一个 xquery 来 1) 找到具有给定 userid 的用户 - sony 2) 将给定用户的“test”属性的值更改为“newvalue”。
我正在尝试以下操作:(其中 doc_name = xml 文档的名称,userid = sony)
declare variable $doc_name as xs:string external;
declare variable $userid as xs:string external;
let $users_doc := doc($doc_name)/users
let $old := $users_doc/user[userid=$userid]/@test="oldvalue"
let $new := $users_doc/user[userid=$userid]/@test="newvalue"
return replace node $old with $new
Run Code Online (Sandbox Code Playgroud)
我看到以下错误: [XUTY0008] 预期作为替换目标的单个元素、文本、属性、注释或 pi。
我该如何解决?
我正在尝试构建简单的XML数据库(在BaseX或eXist-db中),但我无法确定如何修改文档中的值:
内容很简单,因为测试:
<p>
<pl>
<id>6></id>
</pl>
</p>
Run Code Online (Sandbox Code Playgroud)
我正在尝试构建类似函数的东西,<pl>如果元素不存在则会插入元素,如果存在则替换它.但XQuery给了我麻烦:
当我尝试使用if-then-else逻辑时:
if (exists(/p/pl[id=6]/name)=false)
then insert node <name>thenname</name> into /p/pl[id=6]
else replace value of node /p/pl[id=6]/name with 'elsename'
Run Code Online (Sandbox Code Playgroud)
我收到错误Error: [XUDY0027] Replace target must not be empty.显然我很困惑,为什么在两种情况下评估else部分,因此错误.当我清空其他部分时:
if (exists(/p/pl[id=6]/name)=true)
then insert node <name>thenname</name> into /p/pl[id=6]
else <dummy/>
Run Code Online (Sandbox Code Playgroud)
然后我明白了Error: [XUST0001] If expression: no updating expression allowed.
当我尝试声明更新功能时,即使它报告错误:
declare namespace testa='test';
declare updating function testa:bid($a, $b)
{
if (exists(/p/pl[id=6]/name)=true)
then insert node <name>thenname</name> into /p/pl[id=6]
else <dummy/>
};
testa:bid(0,0)
Run Code Online (Sandbox Code Playgroud)
Error: …
我认识到使用 BaseX 客户端执行的 ( insert/ delete)-XQueries 始终返回空字符串。我发现这非常令人困惑或不直观。
有没有办法找出查询是否“成功”,而无需再次查询数据库(并使用可能有错误的“传递”逻辑,例如“如果我删除了一个节点,则 XML 中必须有 'oldNodeCount-1' 节点”) ?