有没有办法将这两个替换值与1个更新语句组合在一起?
UPDATE dbo.MyTable
SET MyXmlColumn.modify('replace value of (/node/@att1)[1] with "1"')
WHERE id = 1
UPDATE dbo.MyTable
SET MyXmlColumn.modify('replace value of (/node/@att2)[1] with "2"')
WHERE id = 1
Run Code Online (Sandbox Code Playgroud)
http://msdn.microsoft.com/en-US/library/ms190675(v=SQL.90).aspx
我有一个名为XML的表(在SQL Server 2008中),它有一个名为XmlDocument
type 的字段XML
.我试图从XML变量中删除属性.
这是我的xml的样子
<clue_personal_auto xmlns="http://cp.com/rules/client">
<admin>
<receipt_date>03/16/2011</receipt_date>
<date_request_ordered>03/16/2011</date_request_ordered>
<report_usage>Personal</report_usage>
</admin>
</clue_personal_auto>
Run Code Online (Sandbox Code Playgroud)
我的查询
UPDATE XML
SET XmlDocument.modify('delete (/clue_personal_auto/@xmlns)[1]')
WHERE xmlid = 357
Run Code Online (Sandbox Code Playgroud)
当我在查询分析器中运行此查询时,我看到消息"1行受影响",但实际上clue_personal_auto元素的xmlns属性未被删除.知道我做错了什么.
谢谢BB
我有一个从单个select语句创建的@XML文档。
<root>
<node>
<node1>
<targetNode>
</targetNode>
</node1>
<node1>
<targetNode>
</targetNode>
</node1>
<node1>
<targetNode>
</targetNode>
</node1>
</node>
<node>
......
</node>
</root>
Run Code Online (Sandbox Code Playgroud)
我想将xsi:nil插入此文档的'targetNode'属性。
@XML.modify( 'insert attribute xsi:nil {"true"} into (root/node/node1/targetNode) [1]')
Run Code Online (Sandbox Code Playgroud)
上面的代码会将属性插入@XML文档中targetNode的第一次出现。但是,insert语句仅在单个节点上起作用。有什么方法可以将此属性插入@XML文档中的targetNode的所有实例中。
所以基本上我有一个脚本,根据这个节点是否存在更新XML.这是t-sql
DECLARE @newJob XML
SET @newJob = N'<job>
<job-detail>
<name>job-name</name>
</job-detail>
</job>'
;WITH XMLNAMESPACES(DEFAULT 'http://quartznet.sourceforge.net/JobSchedulingData')
UPDATE XmlTable
SET ConfigXml.modify('
insert sql:variable("@newJob")
as last into (/quartz)[1]')
WHERE ConfigXml.exist(N'//quartz/job/job-detail/name[.="job-name"]') = 0
Run Code Online (Sandbox Code Playgroud)
现在一切都按预期工作,只是插入的节点现在包含这样的空命名空间
<job xmlns="">
Run Code Online (Sandbox Code Playgroud)
如果我删除
;WITH XMLNAMESPACES(DEFAULT 'http://quartznet.sourceforge.net/JobSchedulingData')
Run Code Online (Sandbox Code Playgroud)
查询停止执行.我认为这是因为我的根节点定义了名称空间
<quartz xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" overwrite-existing-jobs="true">
Run Code Online (Sandbox Code Playgroud)
所以我的问题是 - 有没有办法阻止这个名称空间添加到正在插入的节点?
我有以下 xml 字段,我需要在其中替换节点之一的值:
<DataFormItem xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="bb_appfx_dataforms">
<Values>
<fv ID="FUNDRAISERID">
<Value xmlns:q1="http://microsoft.com/wsdl/types/" xsi:type="q1:guid">1009fb5a-41a0-40c1-8685-d5973fb71df7</Value>
<ValueTranslation>John Smith</ValueTranslation>
</fv>
<fv ID="STARTDATE">
<Value xsi:type="xsd:dateTime">2015-01-01T00:00:00</Value>
</fv>
</Values>
</DataFormItem>
Run Code Online (Sandbox Code Playgroud)
我需要将 STARTDATE 值“2015-01-01T00:00:00”更改为“2016-01-01T00:00:00”。为此,我编写了以下查询:
update KPIINSTANCE
SET NAME = '2016 ' + SUBSTRING(k.name, 6,150),
PARAMETERSXML.modify('
declare namespace df = "bb_appfx_dataforms";
replace value of (/df:DataFormItem/df:Values/df:STARTDATE/df:Value)[1] with "2016-01-01T00:00:00" cast as xs:dateTime ?')
FROM KPIINSTANCE K
JOIN KPICATALOG KP ON KP.ID = K.KPICATALOGID
where k.ID = '43C6DA6B-420A-4D4E-BA31-84C8054B4AB6'
Run Code Online (Sandbox Code Playgroud)
据我所知,这是正确的,但是当我尝试运行查询时,出现错误:XQuery [KPIINSTANCE.PARAMETERSXML.modify()]: The target of 'replace value of' must be a non-metadata属性或具有简单类型内容的元素,找到 'element(df{bb_appfx_dataforms}:Value,xdt:untyped) ?' …
在我的表中,我有一个包含XML
数据的列.
例如,假设架构如下:
<person>
<id></id>
<name></name>
</person>
Run Code Online (Sandbox Code Playgroud)
问题是这些节点中的一些节点有额外的节点 <lastname>
现在,我想更新此列中的所有元素,以便每个元素都lastname
具有默认值的节点smith
.
我有一个MS SQL 2008 R2标准数据库.我有一个包含varchar(250)
数据和列的列xml
.
CREATE TABLE [dbo].[art](
[id] [int] IDENTITY(1,1) NOT NULL,
[idstr] [varchar](250) NULL,
[rest] [xml] NOT NULL,
CONSTRAINT [PK_art] PRIMARY KEY CLUSTERED ([id] ASC)
)
Run Code Online (Sandbox Code Playgroud)
问题是我想在大约140条记录中将字符串函数的结果插入到xml中.我试过xml.modify
用动态生成的文本.
UPDATE [pwi_new].[dbo].[art]
SET rest.modify('insert <e><k>link</k><v>'
+ my_string_function(idstr) + '</v></e> into (/root)[1]')
WHERE parent = 160
AND idstr LIKE '%&%'
GO
Run Code Online (Sandbox Code Playgroud)
但是,我有这个错误:
The argument 1 of the XML data type method "modify" must be a string literal.
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我想避免使用时态字段,外部语言和从生成的字符串执行TSQL?(我听说过的sql:variable
和sql:column
,但是这是TSQL函数的结果.)
我的MSSQL数据库中有一个XML列,其架构类似于:
<Form>
<Version>1000</Version>
<OtherValues />
</Form>
Run Code Online (Sandbox Code Playgroud)
我需要手动将所有行的Version
数字(通过脚本)更改为1001.在搜索时,我可以推断出我将使用.modify
XPath函数,但我发现的所有示例都是用于插入节点,而不是编辑它们.
有人可以说明如何做到这一点吗?